javaagent的简单使用
2021/5/30 12:21:47
本文主要是介绍javaagent的简单使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. 概述
每个程序都是从main方法开始执行,指定javaagent后,则可以在main方法前执行agent的premain方法。
下面说下结合javassist修改指定类的字节码信息,实现方法延时的统计功能。
2. 使用示例
2.1 编写方法统计代码
public class Test001 implements ClassFileTransformer { @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (!"easylog/EasyLog".equals(className)) { return null; } try { ClassPool pool = ClassPool.getDefault(); CtClass clazz = pool.get("easylog.EasyLog"); for (CtConstructor constructor : clazz.getConstructors()) { constructor.addLocalVariable("c", CtClass.longType); constructor.insertBefore("System.out.println(\"====== before =====\");"); constructor.insertBefore("c = System.currentTimeMillis();"); constructor.insertAfter("System.out.println(\"time use: \" + (System.currentTimeMillis() - c));"); constructor.insertAfter("System.out.println(\"====== end =====\");"); } byte[] byteCode = clazz.toBytecode(); clazz.detach(); return byteCode; } catch (Exception e) { e.printStackTrace(); } return null; } }
2.2 编写代理启动类
public class PreMain { public static void premain(String agentArgs, Instrumentation inst) { System.out.println("params " + agentArgs); inst.addTransformer(new Test001()); } }
2.3 打包程序并修改MAINFEST.MF文件,添加Premain-Class入口
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Build-Jdk: 1.8.0_161 Main-Class: main.AppMain Premain-Class: main.PreMain
2.4 执行程序
java -javaagent:javaagent-1.0.jar=name,aa=name -jar …/main.jar
其中javaagent-1.0.jar是我们刚才打包好的程序
=name,aa=name是我们指定的参数
main.jar是其他业务程序
我们可以通过上述方式无侵入的方式统计其他业务程序指定方法的延时情况。
这篇关于javaagent的简单使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-20接口模块封装入门教程
- 2024-09-20请求动作封装入门教程
- 2024-09-20登录鉴权学习:新手入门教程
- 2024-09-20后台管理开发学习:新手入门指南
- 2024-09-20后台管理系统开发学习:从入门到实践
- 2024-09-20后台开发学习:从入门到初级实战指南
- 2024-09-20后台综合解决方案学习:从入门到实践
- 2024-09-20接口模块封装学习入门指南
- 2024-09-20请求动作封装学习:新手入门教程
- 2024-09-20登录鉴权入门:打造安全的用户认证系统