gpt4 book ai didi

Javassist:javassist.CannotCompileException:由java.lang.ClassFormatError:类文件中的方法名称和签名重复

转载 作者:太空宇宙 更新时间:2023-11-04 13:11:27 29 4
gpt4 key购买 nike

我正在使用 javassist 来更改方法体。当该方法在应用程序中定义时我可以做到这一点。但是,当我想更改应用程序使用的 jar 文件中定义的方法时,我会收到以下运行时错误:

javassist.CannotCompileException: by java.lang.ClassFormatError: Duplicate method name&signature in class file pk1/StringBuilder.

下面的代码用于更改方法体。我正在使用 Eclipse IDE。当调用 clas.toClass(); 时会发生错误。

public class JassistTiming {

public static void main(String[] arg) {

//first parameter is name of class, and the second one is name of method
String[] argv = {"pk1.StringBuilder","buildString"};

// start by getting the class file and method
CtClass clas = ClassPool.getDefault().get(argv[0]);

// add timing interceptor to the class
addTiming(clas, argv[1]);
clas.writeFile();
System.out.println("Added timing to method " + argv[0] + "." + argv[1]);

clas.toClass(); //Run time error happens here
}

private static void addTiming(CtClass clas, String mname) throws NotFoundException, CannotCompileException {

CtMethod mold = clas.getDeclaredMethod(mname);

String nname = mname+"$impl";
mold.setName(nname);
CtMethod mnew = CtNewMethod.copy(mold, mname, clas, null);

String type = mold.getReturnType().getName();
StringBuffer body = new StringBuffer();
body.append("{\nlong start = System.currentTimeMillis();\n");
if (!"void".equals(type)) {
body.append(type + " result = ");
}
body.append(nname + "($$);\n");

body.append("System.out.println(\"Call to method " + mname +
" took \" +\n (System.currentTimeMillis()-start) + " +
"\" ms.\");\n");
if (!"void".equals(type)) {
body.append("return result;\n");
}
body.append("}");

mnew.setBody(body.toString());
clas.addMethod(mnew);
}
}

更新:StringBuilder 的代码:

public class StringBuilder { 

public String buildString(int length) {

String result = "";

for (int i = 0; i < length; i++) {
result += (char)(i%26 + 'a');
}

return result;
}

最佳答案

我相信我找到了原因。

假设foobar.jar包含类pk1.StringBuilder

以下工作正常

java -cp javassist-3.7.ga.jar:foobar.jar:. JassistTiming 
java -cp javassist-3.7.ga.jar:foobar.jar:. JassistTiming

检测类StringBuilder.class存储在子目录pk1中,并调用检测方法。

以下内容也有效

java -cp javassist-3.7.ga.jar:.:foobar.jar JassistTiming 

但第二次执行失败,因为类 StringBuilder.class 现在首先在子目录 pk1 中找到,该子目录是已检测的类,因此该类中已存在方法 public void buildString$impl()

关于Javassist:javassist.CannotCompileException:由java.lang.ClassFormatError:类文件中的方法名称和签名重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33913872/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com