java代码编译时修改行为_GitHub - niuzhihua/AST_demo: 利用JavaParser框架在编译时修改语法树(源码)的 demo...
本例子展示了如下功能:
1、刪除方法中的 打印日志代碼。
2、刪除指定的 方法 和 成員變量。
3、檢測方法中 是否有 new Thread 代碼。
4、生成新的類和方法。并在運行時驗證。
5、解析 類文件: MainActivity.java , 并在打印輸出類信息。
6、修改類中的方法。 將結果保存在工程目錄下的 /output 中。
7、在現有類 中生成一個方法 ,并在運行時驗證。
環境:
gradle4.1
classpath 'com.android.tools.build:gradle:3.0.1'
1、刪除類方法中的 日志 :
Log.xxxx
System.out.xxx
2、刪除指定的的 方法 和 成員變量
//過濾如下 成員變量 和 方法
public void test()
public int test(int a)
String abc
String def
3、檢測方法中 是否有 new Thread 代碼
若檢測到則在gradle 的build 控制臺中輸出:
警告: --代碼中含有 new Thread--onResume()
警告: --代碼中含有 new Thread--test(int a)
下面是利用javaparser 框架來造作代碼的例子:
4、
一:利用javaparser 生成一個類,并包含一個靜態方法。
二:利用javax.annotation.processing.Filer 文件工具 將代碼寫入到編譯路徑 :
/app/build/generated/source/apt/debug/ gen/GenClassA.class
這樣生成的代碼就會被編譯并打包進apk.
運行時在MainActivity 中驗證。
onClick(View v) {
Class clazz = Class.forName("com.nzh.ast.gen.GenClassA");
Method method = clazz.getMethod("genMethod", String.class, int.class);
Object obj = method.invoke(null, "test string", 33);
if (obj != null) {
List list = (List) obj;
Toast.makeText(MainActivity.this, list.toString(), Toast.LENGTH_LONG).show();
}
}
5、 解析 類文件: MainActivity.java , 并在打印輸出類信息。
6、 修改類文件: MainActivity.java , 并將結果備份保存在 /output 目錄下
一、在 MainActivity.java 中生成一個 方法:
public static List testNewMethod(String p1, List myList) {
java.util.List list = new ArrayList();
return list;
}
二、修改 MainActivity.java中的 old 方法:
修改前:
public void old(int i)
修改后:
public void old(int i, Map map)
三、 刪除 old方法 的方法體
刪除前:
public void old() {
int a = 6;
int b = 8;
int c = a + b;
}
刪除后:
public void old() {
}
四、修改old3 方法的注解,將@MethodAnnotaion 注解 替換為 @MethodAnnotaion2 注解。并填寫相應注解的值
修改前:
@MethodAnnotaion("abc")
public void old3() {
修改后:
@MethodAnnotaion2(kkk = "hahaha", iii = 666)
public void old3() {
7、 在現有類(TestLog.java)中生成一個方法 如下:
public static String genMethod(String str) {
String s = " hello world !!!-8-";
return s;
}
運行時在MainActivity 中驗證 入下:
onClick{
Class clazz = Class.forName("com.nzh.ast.demo.TestLog");
Method method = clazz.getMethod("genMethod", String.class);
Object obj = method.invoke(null, "test string");
if (obj != null) {
String result = (String) obj;
Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
}
}
運行注意:
方式1 :先執行 gradlew :app:assembleDebug 命令 或 在build 視圖中點擊 restart 按鈕,
這樣就先生成了代碼。然后點擊 run app 按鈕運行app .
方式2 : 點擊 run app 按鈕運行app 兩次。 第一次是生成代碼。第二次將生成的代碼 編譯打包進apk.
總結
以上是生活随笔為你收集整理的java代码编译时修改行为_GitHub - niuzhihua/AST_demo: 利用JavaParser框架在编译时修改语法树(源码)的 demo...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么取消电脑登录页面设置密码 如何取消电
- 下一篇: java美元兑换,(Java实现) 美元