本例子展示了如下功能:

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...相关推荐

  1. java毕业设计——基于java+JSP+sqlserver的Smart系统-题库及试卷管理模块设计与实现(毕业论文+程序源码)——学生信息管理系统模板2

    基于java+JSP+sqlserver的Smart系统-题库及试卷管理模块设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+JSP+sqlserver的Smart系统-题库及试卷 ...

  2. 基于JAVA框架的电脑测评系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA框架的电脑测评系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA框架的电脑测评系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: 项目 ...

  3. java计算机毕业设计HTML5“忆红楼梦之味”网站设计与实现MyBatis+系统+LW文档+源码+调试部署(2)

    java计算机毕业设计HTML5"忆红楼梦之味"网站设计与实现MyBatis+系统+LW文档+源码+调试部署(2) java计算机毕业设计HTML5"忆红楼梦之味&quo ...

  4. java计算机毕业设计Vue.js网上书城管理系统设计与实现服务端MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计Vue.js网上书城管理系统设计与实现服务端MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计Vue.js网上书城管理系统设计与实现服务端MyBatis+系统 ...

  5. 数据结构,单链表讲解,并使用Java代码实现单链表增删改查【尾部添加,中间插入、修改节点、删除节点、展示链表】

    文章目录 单链表 什么是单链表,链式存储结构详解 链表的节点 头节点,头指针和首元节点 单链表的实现 1.尾部添加新节点 思路分析 代码实现 注意事项 2.按照编号插入新节点 思路分析 代码实现 注意 ...

  6. java推送微信消息换行_5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)...

    我们在做小程序开发时,消息推送是不可避免的.今天就来教大家如何实现小程序消息推送的后台和前台开发.源码会在文章末尾贴出来. 其实我之前有写过一篇:<springboot实现微信消息推送,java ...

  7. 【java毕业设计】基于javaEE+SSH+mysql+strust2的超市积分管理系统设计与实现(毕业论文+程序源码)——超市积分管理系统

    基于javaEE+SSH+mysql+strust2的超市积分管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+SSH+mysql+strust2的超市积分管理系统设计 ...

  8. Java虚拟机启动整体流程和基础学习(内容很多,不可快餐阅读),推理+源码论证

    不啰嗦,直接看: ISA指令强关联CPU平台,那么汇编语言也一定强关联CPU平台,而C语言又是对汇编最简单的抽象,也就一定会耦合不同CPU平台的代码,这也就是意味着,在写C/C++项目的时候,必须要考 ...

  9. 【java毕业设计】基于javaEE+原生Servlet+MySql的企业员工信息管理系统设计与实现(毕业论文+程序源码)——企业员工信息管理系统

    基于javaEE+原生Servlet+MySql的企业员工信息管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+原生Servlet+MySql的企业员工信息管理系统设计 ...

最新文章

  1. python设计模式(十三):解释器模式
  2. CSDN付费专栏写作感悟及成长之路、兼论学习会员模式的创作者协同效应
  3. 东京奥运会将利用 AI 识别可疑人员
  4. Centos6.5下安装java1.7+apache-tomcat7.5
  5. 怎么使用7zip进行分批压缩_装机必备软件之压缩软件篇——7zip
  6. storm的流分组策略
  7. maven配置(myeclipse版)
  8. 面试中的智力题及编程实践(二)
  9. 数据科学包7- pandas高级内容之分组运算
  10. 台式计算机cpu多高,台式机硬件正常温度是多少
  11. matplotlib中文字体设置
  12. 100%正确率识别票据从金融领域切入挖掘文字识别的巨大价值
  13. 计算机二级程序设计提交,程序设计方法与风格(计算机二级复习指导)
  14. 【谷粒学院】微信支付功能案例笔记
  15. 【杭电数电实验】verilog入门指北
  16. 如何把极坐标化为直角坐标_如何把极坐标化为直角坐标
  17. axios中的put和patch有什么区别
  18. Karto的后端优化与回环检测功能对比测试与分析
  19. 五分钟学后端技术:一篇文章告诉你如何学习云计算!
  20. cdn缓存服务器有网站图片,cdn缓存服务器上传图片

热门文章

  1. make: *** [out/target/common/obj/APPS/Phone_intermediates/classes-full-debug.jar] 错误 41
  2. BRCM5.02编译五: fatal error: uuid/uuid.h: No such file or directory compilation terminated
  3. 利用RC网络降低可调节LDO输出噪声
  4. 基于MATLAB的车牌定位和识别
  5. 基于GRNN神经网络的数字预失真系统的FPGA实现
  6. C语言基础:时间转换成字符串 strftime的代码
  7. Servlet重定向的过程(二)
  8. 白话tensorflow分布式部署和开发
  9. tomcat端口被占用
  10. 关于plsql连接oracle数据库session失效时间设置