java.lang.Instrument包是在JDK5引入的,开发者可以通过修改方法的字节码实现动态修改类代码。javaagent的主要功能如下:
java.lang.Instrument
可以在加载class文件之前做拦截,对字节码做修改(premain),可以实现AOP、修改源代码等功能。
premain
AOP
可以在运行期对已加载类的字节码做变更(agentmain),可以实现热部署等功能。
agentmain
还有其他一些小众的功能
获取所有已经加载过的类
获取所有已经初始化过的类(执行过clinit方法,是上面的一个子集)
获取某个对象的大小
将某个jar加入到bootstrap classpath里作为高优先级被bootstrapClassloader加载
将某个jar加入到classpath里供AppClassloard去加载
设置某些native方法的前缀,主要在查找native方法的时候做规则匹配
假如在项目agent-demo中引入一个第三方jar包dog-1.0.0.jar,其中有一个类com.maxwell.learning.javaagent.dog,代码如下:
agent-demo
dog-1.0.0.jar
com.maxwell.learning.javaagent.dog
public class Dog{ public toString(){ return "i am a cute dog"; } }
现在,想修改这个类的toString()方法,修改为
toString()
使用java agent来修改Dog类的源码,需要写一个agent和ClassFileTransformer:
java agent
agent
ClassFileTransformer
DogAgent