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+JSP+sqlserver的Smart系统-题库及试卷管理模块设计与实现(毕业论文+程序源码)——学生信息管理系统模板2
基于java+JSP+sqlserver的Smart系统-题库及试卷管理模块设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+JSP+sqlserver的Smart系统-题库及试卷 ...
- 基于JAVA框架的电脑测评系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
基于JAVA框架的电脑测评系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA框架的电脑测评系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: 项目 ...
- java计算机毕业设计HTML5“忆红楼梦之味”网站设计与实现MyBatis+系统+LW文档+源码+调试部署(2)
java计算机毕业设计HTML5"忆红楼梦之味"网站设计与实现MyBatis+系统+LW文档+源码+调试部署(2) java计算机毕业设计HTML5"忆红楼梦之味&quo ...
- java计算机毕业设计Vue.js网上书城管理系统设计与实现服务端MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计Vue.js网上书城管理系统设计与实现服务端MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计Vue.js网上书城管理系统设计与实现服务端MyBatis+系统 ...
- 数据结构,单链表讲解,并使用Java代码实现单链表增删改查【尾部添加,中间插入、修改节点、删除节点、展示链表】
文章目录 单链表 什么是单链表,链式存储结构详解 链表的节点 头节点,头指针和首元节点 单链表的实现 1.尾部添加新节点 思路分析 代码实现 注意事项 2.按照编号插入新节点 思路分析 代码实现 注意 ...
- java推送微信消息换行_5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)...
我们在做小程序开发时,消息推送是不可避免的.今天就来教大家如何实现小程序消息推送的后台和前台开发.源码会在文章末尾贴出来. 其实我之前有写过一篇:<springboot实现微信消息推送,java ...
- 【java毕业设计】基于javaEE+SSH+mysql+strust2的超市积分管理系统设计与实现(毕业论文+程序源码)——超市积分管理系统
基于javaEE+SSH+mysql+strust2的超市积分管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+SSH+mysql+strust2的超市积分管理系统设计 ...
- Java虚拟机启动整体流程和基础学习(内容很多,不可快餐阅读),推理+源码论证
不啰嗦,直接看: ISA指令强关联CPU平台,那么汇编语言也一定强关联CPU平台,而C语言又是对汇编最简单的抽象,也就一定会耦合不同CPU平台的代码,这也就是意味着,在写C/C++项目的时候,必须要考 ...
- 【java毕业设计】基于javaEE+原生Servlet+MySql的企业员工信息管理系统设计与实现(毕业论文+程序源码)——企业员工信息管理系统
基于javaEE+原生Servlet+MySql的企业员工信息管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+原生Servlet+MySql的企业员工信息管理系统设计 ...
最新文章
- python设计模式(十三):解释器模式
- CSDN付费专栏写作感悟及成长之路、兼论学习会员模式的创作者协同效应
- 东京奥运会将利用 AI 识别可疑人员
- Centos6.5下安装java1.7+apache-tomcat7.5
- 怎么使用7zip进行分批压缩_装机必备软件之压缩软件篇——7zip
- storm的流分组策略
- maven配置(myeclipse版)
- 面试中的智力题及编程实践(二)
- 数据科学包7- pandas高级内容之分组运算
- 台式计算机cpu多高,台式机硬件正常温度是多少
- matplotlib中文字体设置
- 100%正确率识别票据从金融领域切入挖掘文字识别的巨大价值
- 计算机二级程序设计提交,程序设计方法与风格(计算机二级复习指导)
- 【谷粒学院】微信支付功能案例笔记
- 【杭电数电实验】verilog入门指北
- 如何把极坐标化为直角坐标_如何把极坐标化为直角坐标
- axios中的put和patch有什么区别
- Karto的后端优化与回环检测功能对比测试与分析
- 五分钟学后端技术:一篇文章告诉你如何学习云计算!
- cdn缓存服务器有网站图片,cdn缓存服务器上传图片
热门文章
- make: *** [out/target/common/obj/APPS/Phone_intermediates/classes-full-debug.jar] 错误 41
- BRCM5.02编译五: fatal error: uuid/uuid.h: No such file or directory compilation terminated
- 利用RC网络降低可调节LDO输出噪声
- 基于MATLAB的车牌定位和识别
- 基于GRNN神经网络的数字预失真系统的FPGA实现
- C语言基础:时间转换成字符串 strftime的代码
- Servlet重定向的过程(二)
- 白话tensorflow分布式部署和开发
- tomcat端口被占用
- 关于plsql连接oracle数据库session失效时间设置