java agent简介
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方法。
参考asm文档简单修改了下打印方法执行时间的demo
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: true使用下面代码,将agent添加到指定java进程
vm = 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[]字节数组
最新文章
- 在UTF-8中,一个汉字为什么需要三个字节?
- Keil代码中for循环延时问题
- iOS 为类添加Xib里面配置的view
- How to send Email using C#
- 如何处理JSON数据中含有双引号
- MySQL运行出错:无法连接驱动、无root访问权限解决办法
- Android 中建立一个OpenGL ES的开发环境
- build-essential
- 浅谈Mybatis(一)
- 积累的VC编程小技巧之图标、光标及位图
- 用C++实现的元胞自动机
- jrebel的安装配置
- 【Unity3D与23种设计模式】中介者模式(Mediator)
- 删除office拥有多个都需要激活的授权信息
- 在vue项目中 获取容器的高度
- Kubernetes采用CoreDNS
- linux中的通配符、元字符、转义符
- Shell中的表达式及IF
- Android --------------------ActionBar 与 ViewPager 和 ActionTab 切换 的源代码实现
- node引入bootstrap npm报错
热门文章
- 深入刨析tomcat 之---第8篇 how tomcat works 第11章 11.9应用程序,自定义Filter,及注册
- 关于ClassLoader 和Class的俩个记录
- 使用 Python 翻译 CHM 帮助文档
- QT从入门到入土(四)——多线程(QtConcurrent::run())
- SpringBoot | 3.3 整合MyBatis-Plus
- IOC(概念和原理)
- 解决SecureCRT中删除会话后无法重建问题
- Http协议中的CharacterEncoding、Content-Encoding和Transfer-Encoding
- 【笔记】随机森林和Extra-Trees
- 在VMware中安装Centos6值得注意的几点