验证错误:opc_invokeinterface的args_size不一致
问题描述:
我一直在尝试生成一些动态代码(使用Javassist),但是当涉及双数组或浮点数组时,程序在某个点失败。代码如下所示验证错误:opc_invokeinterface的args_size不一致
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:(class:testapp1/Dyn,method:processDouble signature:(Lsomething/Output; Ljava/lang/Object;)V)opc_invokeinterface的args_size不一致
一种解决方法,但没有任何意义,即一切工作正常,如果我只需要创建一个双数组的一个拷贝,并把它传递给processDouble动态代码 即如果动态代码是
testapp1.Customers temp=(testapp1.Customers)graph;
double[] d = temp.Dubs;
output.processDouble(d);
在简单,异常getDeclaredConstructor引发未处理,但它实际上与构造函数无关,因为它无关紧要,如果我创建一个或不是
希望我的问题和代码足够清楚,如果有任何混淆请告诉,Thankyou in提前:)
答
验证错误是由getDeclaredConstructors抛出的,因为这是类c中字节码第一个被验证的地方。
至于错误的原因,我怀疑它与事实有关,在第一种情况下,你传递一个double,在第二种情况下,一个double []。