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