2011-01-10 79 views
5

我一直在尝试生成一些动态代码(使用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提前:)

回答

0

验证错误是由getDeclaredConstructors抛出的,因为这是类c中字节码第一个被验证的地方。

至于错误的原因,我怀疑它与事实有关,在第一种情况下,你传递一个double,在第二种情况下,一个double []。