Java 验证错误:opc\U调用接口的参数大小不一致
我一直在尝试生成一些动态代码(使用Javassist),但当涉及双数组或浮点数组时,程序在某一点失败。代码如下Java 验证错误:opc\U调用接口的参数大小不一致,java,javassist,Java,Javassist,我一直在尝试生成一些动态代码(使用Javassist),但当涉及双数组或浮点数组时,程序在某一点失败。代码如下 Class c = Customers.class; // called in main & Customer class just has a double[] Dubs = new double[10] CreateType(c); // Main public static Object CreateType(Class genericType) {
Class c = Customers.class; // called in main & Customer class just has a double[] Dubs = new double[10]
CreateType(c); // Main
public static Object CreateType(Class genericType)
{
// some preReq declarations
CtMethod writeCode = dyn.getDeclaredMethod("processCode");
generateCode(genericType, Code, "temp"); // Code is a StringBuilder class
System.out.println(Code);
writeCode.insertAt(1, Code.toString()); // Compilation is successful
Class c = dyn.toClass();
Dynamic h;
Constructor[] ctorlist = null;
ctorlist = c.getDeclaredConstructors(); // Problem is here
h = (DynamicSurrogate) ctorlist[0].newInstance(genericType);
return h;
}
testapp1.Customers temp=(testapp1.Customers)graph;
output.processDouble(temp.Dubs[1]);
生成的代码如下所示
Class c = Customers.class; // called in main & Customer class just has a double[] Dubs = new double[10]
CreateType(c); // Main
public static Object CreateType(Class genericType)
{
// some preReq declarations
CtMethod writeCode = dyn.getDeclaredMethod("processCode");
generateCode(genericType, Code, "temp"); // Code is a StringBuilder class
System.out.println(Code);
writeCode.insertAt(1, Code.toString()); // Compilation is successful
Class c = dyn.toClass();
Dynamic h;
Constructor[] ctorlist = null;
ctorlist = c.getDeclaredConstructors(); // Problem is here
h = (DynamicSurrogate) ctorlist[0].newInstance(genericType);
return h;
}
testapp1.Customers temp=(testapp1.Customers)graph;
output.processDouble(temp.Dubs[1]);
但当getDeclaredConstructors被称为c.getDeclaredConstructors()时,问题就出现了。。。它抛出以下错误
线程“main”java.lang.VerifyError中出现异常:(类:testapp1/Dyn,方法:processDouble signature:(Lsomething/Output;Ljava/lang/Object;)V)opc\u invokeinterface的参数大小不一致
存在一个变通方法,但没有任何意义,即,如果我只是创建一个double数组的副本并在动态代码中将其传递给processDouble,那么一切都可以正常工作
i、 e.如果动态代码为
testapp1.Customers temp=(testapp1.Customers)graph;
double[] d = temp.Dubs;
output.processDouble(d);
简而言之,未处理的异常是由getDeclaredConstructor引发的,但它实际上与构造函数无关,因为不管我是否创建了一个构造函数
希望我的问题和代码足够清楚,如果有任何混淆,请告诉我,提前谢谢:)验证错误从getDeclaredConstructors中抛出,因为这是类c中字节码的第一个验证位置 至于错误的原因,我怀疑这与以下事实有关:在第一种情况下,你传递了一个双精度,在第二种情况下,传递了一个双精度[]