java agent简介
-
主要就是两种,一种的方法是premain,一种是agentmain。这两种的区别是:
- premain是在jvm启动的时候类加载到虚拟机之前执行的
- agentmain是可以在jvm启动后类已经加载到jvm中了,才去转换类。这种方式会转换会有一些限制,比如不能增加或移除字段。
-
具体的做法,两者的实际做法是差不多的:
-
premain
定义个静态方法
public static void premain(String args, Instrumentation inst)
,
在生成jar包中MANIFEST.MF文件中需要有
Premain-Class: xxx.xxx
,xxx.xxx就是上面premain方法所在的类名在java 的启动参数中添加 -javaagent:/jar包路径[=agentArgs]
这样定义了后jvm启动时,就会去加载javaagent中指定的jar包,查找MANIFEST.MF文件中Premain-Class属性的类,执行premain方法。
blogdemo/javabasedemo/agentdemo at main · wbo112/blogdemo (github.com)
-
agentmain
定义个静态方法
public static void agentmain(String agentOps, Instrumentation instrumentation)
,在生成jar包中MANIFEST.MF文件中需要有Agent-Class: xxx.xxx (xxx.xxx就是上面agentmain方法所在的类名)
Can-Retransform-Classes: truevm = VirtualMachine.attach(pid); try { vm.loadAgent("D:\\tmp\\my-java-agent-1.0-jar-with-dependencies.jar", null); } finally { vm.detach(); }
这个github找到一个很不错的案例。wujiuye/bytecode-book: 《Java虚拟机字节码从入门到实战》一书的配套代码 (github.com)
-
-
具体类的转换处理一般都是用asm之类修改字节码的开源组件。主要就是实现ClassFileTransformer接口,对入参的byte[]这个就是class类的字节数组了,对这个进行转换,返回新的class类的byte[]字节数组
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。