# javaagentparent **Repository Path**: jinxin.70/javaagentparent ## Basic Information - **Project Name**: javaagentparent - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 5 - **Created**: 2019-01-02 - **Last Updated**: 2024-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 这个项目做了什么? JavaAgent实验 ## 项目结构是怎样的? 使用Maven的聚合功能创建的项目。 ![projectstructure](doc/projectstructure.png) ### 1.agentdemo模块,是agent代理逻辑模块: 1、关键类MyAgent中必须有一个premain方法 2、resources\META-INF\MANIFEST.MF文件中必须指定agent类的全限定名 ### 2. agenttest模块是一个springboot 项目 ## 如何运行? ### a.首先将agentdemo项目打成jar包 > 执行mvn clean package或者使用IDEA的图形界面执行package 打包后在target下会生成一个my-agent.jar包 ![](doc/jar包.png) ### b.配置agenttest项目的运行配置 -javaagent:agentdemo/target/my-agent.jar=first ![agenttest](doc/agenttest.png) ### c.运行AgenttestApplication的main方法 如果在MyAgent类中打断点,会先运行到断点,才会运行AgenttestApplication的main方法。 打断点后,可以看到agent的运行逻辑定义在InstrumentationImpl的loadClassAndStartAgent方法中 ![instrument](doc/instrument.png) ## 实现一个统计方法调用时间的功能,不改客户端代码,体验下和动态代理的区别 运行结果: ![](doc/instrument2.png) 分析: com.umbrella.robot.agent.DurationTransformer中使用字节码修改类库javassist, > ClassFileTransformer 长期有效,在每一个类加载器加载 Class 的时候都会拦截。 对com.rong.kim.common.Lion中的runLion()方法进行了增强,在最后打印了方法执行时间。 ### Reference > http://jboss-javassist.github.io/javassist/tutorial/tutorial.html#read > https://javapapers.com/core-java/java-instrumentation/ ## 关于Maven打包: 必须先install parent,否则依赖父模块的子模块会打包失败 必须install 公共模块,否则依赖公共模块的子模块会打包失败