Java agentmain 代理修改类报错 class redefinition failed: attempted to add a method
使用 agentmain 时用 Javassist 工具将原来的方法 handle 复制出一个新方法 handle,然后修改原方法名为 handle$old,最后再设置复制出的 handle 方法的方法体,运行时报出标题上的错误。有大佬知道使用 agentmain 是有什么不能新增方法之类的限制吗?
CtMethod ctMethod = ctClass.getDeclaredMethod(methodName);// 得到这方法实例
// 创建新的方法,复制原来的方法,名字为原来的名字
CtMethod newMethod = CtNewMethod.copy(ctMethod, methodName, ctClass, null);
// 定义一个方法名用于描述修改字节码之前的原方法
String oldMethodName = methodName + "$old";
// 将原方法名称修改掉,避免和新添加的方法同名冲突
ctMethod.setName(oldMethodName);
// 构建新的方法体
StringBuilder bodyStr = new StringBuilder();
bodyStr.append("{");
bodyStr.append("long startTime = System.currentTimeMillis();\n");
// 调用原方法代码,类似于method();($$)表示所有的参数
bodyStr.append(oldMethodName).append("($$);\n");
bodyStr.append("long endTime = System.currentTimeMillis();\n");
String outputStr = "System.out.println(\"this method " + methodName
+ " cost:\" +(endTime - startTime) +\"ms.\");\n";
bodyStr.append(outputStr);
bodyStr.append("}");
// 设置新的目标方法的方法体
newMethod.setBody(bodyStr.toString());
// 增加新方法, 原来的方法已经被修改名称为 oldMethodName,调用时会调用到新的目标方法
ctClass.addMethod(newMethod);
...全文
相关推荐
java动态编译java源文件
java动态编译java源文件,并利用Instrumentation实现重定义class
字节码插桩之Java Agent
本文主要讲述了Java Agent的一些基本知识和简单原理,并通过一些实际的案例进行实践,帮助大家加深对Java Agent的认识,后续还会出相关案例,敬请期待哦!
29Linux基础命令详解——用户管理.docx
29Linux基础命令详解——用户管理
科技服务机构如何通过数据分析增强服务竞争力?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
vue+springboot基于 Java 的南昌实利广告公司的员工管理系统的设计与实现_oj680rl3毕业设计源码数据库.zip
vue+springboot基于 Java 的南昌实利广告公司的员工管理系统的设计与实现_oj680rl3毕业设计源码数据库.zip


Java SE
