Java Agent初探——动态修改代码
2017-02-21 17:35
239 查看
用了一下午总算把java agent给跑通了,本篇文章记录一下具体的操作步骤,以免遗忘。。。
通过java agent可以动态修改代码(替换、修改类的定义),进行AOP。
目标:
?
需要两个程序,一个是用来测试的程序,一个agent用于修改代码。
- ToString.java
- Foo.java
- Main.java
具体代码如下:
ToString.java:定义ToString注解
?
Foo.java:很简单用于测试,使用了ToString注解
?
Main.java:
?
执行Main.java,结果如下:
?
可以看到toString返回的是Object的默认实现。
- main函数开始前
- 程序运行中
这里主要测试main函数开始前的情况。类似于main函数,需要实现
?
这个函数会在main函数之前被调用。可以在premain中,进行字节码操作,替换或重新实现一些类。这里使用Byte Buddy库,在ASM之上提供了更高级的抽象,便于使用。具体代码如下:
?
agent需要打包成jar,并且对于premain的方式需要在MANIFEST.MF中指定Premain-Class,用于指明包含premain函数的类。具体有两种方式打包:
1)直接通过jar命令
编辑生成MANIFEST.MF后,执行:
?
上述命令打包成的jar包含:
- com:编译生成的class文件
- lib:其依赖的库
2)通过maven直接生成:
通过maven-jar-plugin插件生成jar包,具体配置如下:
?
主要通过manifestEntries标签生成自动的属性,这里指定了Premain-Class
?
在当前目录执行命令:
?
运行结果如下:
?
这里需要注意一点,如果将测试程序也打包成jar包的话,那么在通过-cp指定ByteBuddy库时会失败,找不到对应的class,错误如下:
?
暂时不知道具体原因。。。所以直接以class运行即可
通过java agent可以动态修改代码(替换、修改类的定义),进行AOP。
目标:
?
1. 测试程序
被测试的程序包括:- ToString.java
- Foo.java
- Main.java
具体代码如下:
ToString.java:定义ToString注解
?
?
?
?
2. Agent程序
java agent程序实际上类似于钩子,有两种方式:- main函数开始前
- 程序运行中
这里主要测试main函数开始前的情况。类似于main函数,需要实现
?
?
1)直接通过jar命令
编辑生成MANIFEST.MF后,执行:
?
- com:编译生成的class文件
- lib:其依赖的库
2)通过maven直接生成:
通过maven-jar-plugin插件生成jar包,具体配置如下:
?
3. 运行
将生成的agent.jar、依赖的ByteBuddy的jar包和测试程序编译生成的class文件放到一个路径下,目录布局如下:?
?
?
?
相关文章推荐
- Java Agent入门学习之动态修改代码
- Java动态修改代码
- 不修改源代码,动态注入Java代码的方法
- java.lang.Instrument 动态修改替换类代码
- javaagent demo程序(使用javaagent实现字节码层面的代码修改)
- java.lang.Instrument 动态修改替换类代码
- [原创]ASM动态修改JAVA函数之函数字节码初探
- Java代码动态修改 ConstraintLayout 内控件布局的辅助类
- java代码动态修改app图标
- 得用java agent instrument动态修改或替换相关
- java.lang.Instrument 动态修改替换类代码
- 一段用java反射动态构建对象的代码
- 为你的应用程序添加动态Java代码
- ASP.NET程序中动态修改web.config中的设置项目(后台CS代码)
- 比较编译技术--Java 代码的静态编译和动态编译中的问题
- 用C/C++实现代码的动态修改(SMC)
- Java下的Framework编写(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)(1)--序
- 动态生成JAVA代码
- 动态生成JAVA代码(三)
- Java动态代理示例代码