JAVA-Agent探针打印方法执行的返回值

news/发布时间2024/5/17 16:05:29

 

1、创建一个maven项目,不要用springboot的

 

引入依赖

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.29.0-GA</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.24</version></dependency>

其中 javassist这个依赖必须的 其他是代码逻辑用到的 根据自己需要来

 

设置打包插件

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><!--将所有依赖都打入同一个jar包中--><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><!--指定java agent相关配置文件--><archive><manifestFile>src/main/resources/MANIFEST.MF</manifestFile></archive></configuration></plugin>

 

 

编写主类代码

JavaAgent.java

import java.lang.instrument.Instrumentation;/*** 拦截打印方法的返回值*/
public class JavaAgent {public static void premain(String agentArgs, Instrumentation inst) {inst.addTransformer(new ClassPreProcessorAgentAdapter(), true);}}

agentArgs:可以通过这个把一些参数传进来  

 

ClassPreProcessorAgentAdapter.java

import javassist.*;
import org.apache.commons.lang3.StringUtils;import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;/*** 打印方法返回值 具体逻辑*/
public class ClassPreProcessorAgentAdapter implements ClassFileTransformer {@Overridepublic byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {//是我们自己写的类才打印if (StringUtils.isBlank(className)) {return classfileBuffer;}//将类名路径 / 换成 .String classPkgName = className.replace('/', '.');//如果不是我们写的类 直接返回 这里自定义逻辑if (!classPkgName.contains("IndexController")) {return classfileBuffer;}final ClassPool pool = ClassPool.getDefault();try {CtClass ctClass = pool.makeClass(new java.io.ByteArrayInputStream(classfileBuffer));//匹配类的路径是我们要的才打印if (ctClass.getName().replace('/', '.').startsWith("com.example.demotest")) {for (CtMethod method : ctClass.getDeclaredMethods()) {if (method.hasAnnotation(org.springframework.web.bind.annotation.RequestMapping.class)) {// 这句话最重要 打印返回值的内容method.insertAfter("System.out.println(\"Controller Method Returned: \" + $_);");}}return ctClass.toBytecode();}} catch (Exception e) {e.printStackTrace();}System.out.println("premain load Class:" + className);return classfileBuffer;}}

 

然后resource下放文件

MANIFEST.MF

Manifest-Version: 1.0
Specification-Title: Log Agent
Specification-Version: 0.0.1
Specification-Vendor: LogAgent
Implementation-Title: log.agent
Implementation-Version: 0.0.1
Implementation-Vendor: LogAgent
Premain-Class: com.demo.agent.JavaAgent
Can-Redefine-Classes: true
Can-Retransform-Classes: true

 

  Premain-Class:这个就是我们写的premain的类的全路径 我这里是JavaAgent的类路径 根据自己的来

 最后一行要空一行 ,这个不能少 

 

 

最后打包,会生成一个  jar-with-dependencies.jar结尾的jar包,然后我们通过启动的时候命令引用进去即可

-javaagent:D:\jar包路径\agent-jar-with-dependencies.jar

 

IDEA的话是在那个启动类的 VM options里面设置

如果要调试代码的话 要把启动的项目和我们agent的项目放在一个工程底下,这样idea就能自动断点到

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/15761678.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

认知提升的方法

认知提升的方法一、什么是认知 经验是对于过往经历的总结归纳,当把这种经验传授给别人时,这种经验对别人来说就是知识。所以,知识是人脑对客观事物的信息沉淀。 技能是人们通过练习而获得的动作方式和系统,例如操作技能中的PS技术、木工技术、电工技术、水工技术等,而能力…

将社会脆弱性纳入高分辨率全球洪水风险绘图

贡献 将高分辨率流洪水模型的年平均超标概率估计值与网格化人口和贫困数据相结合,创建了 90 米分辨率的全球洪水脆弱性调整风险指数(VARI Flood)。该指数提供了国家内部或国家之间相对风险的估计值,并通过识别以高密度和高社会脆弱性为特征的 "热点地区",改变了…

acwing351

https://www.acwing.com/activity/content/problem/content/9051/ NOIP2007提高组T4。本题是加强版。 题目描述 设 \(T=(V, E, W)\) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称 \(T\) 为树网(treenetwork),其中 \(V, E\) 分别表示结点与边的集…

Unity热更学习笔记--AB包的依赖 0.98

AB包的依赖 接上一小结。 在这里我们新建一个红色材质球,赋值给Cube预制体。此时不对材质球进行AB包分类,再次进行打包。运行脚本,发现红色cube成功的从AB包中加载出来。尽管我们没有将cube所依赖的材质球进行打包分类,但是打包时候unity会自动将包中的物体相关依赖打入包中…

Y2 知识和题单

Link。 0x01 进制 引入 计数原理,对于 \(N\) 进制,那么就是逢 \(N\) 进一。 计算机中常用二进制,对应电路中的通电(\(1\))断电(\(0\))。 人类从远古以来使用十进制。 常用的有二进制、三进制、八进制、十进制、十六进制等。 由于不同进制之间数值写法可能相同,在没有特…

Clock Switch,芯片时钟切换的毛刺是什么,如何消除

背景 芯片运行过程中需要时钟切换时,要考虑到是否会产生glitch,小小的glitch有可能导致电路运行的错误。所以时钟切换时需要特别的处理。 直接使用MUX进行时钟切换或者采用如下电路结构进行时钟切换:assign outclock = (clk1 & select) | (~select & clk0);或 assig…