Java agentmain 代理修改类报错 class redefinition failed: attempted to add a method

谈谈1974 谈谈1974 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
使用 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);
...全文

相关推荐

评论 12
收藏 已收藏
分享
返回顶部
谈谈1974
Java SE 62,620 成员 307,251 内容