2011-01-10 17 views
5

He intentado generar algunos códigos dinámicos (usando Javassist) pero el programa falla en cierto punto cuando se trata de una matriz doble o una matriz flotante. El código es el siguienteError de verificación: inconsistente args_size para opc_invokeinterface

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; 
} 

El código generado es el siguiente

testapp1.Customers temp=(testapp1.Customers)graph; 
    output.processDouble(temp.Dubs[1]); 

Pero surge un problema cuando se llama getDeclaredConstructors c.getDeclaredConstructors (...) que arroja el siguiente error

Excepción en thread "main" java.lang.VerifyError: (class: testapp1/Dyn, method: processDouble signature: (Lsomething/Output; Ljava/lang/Object;) V) Inconsistent args_size para opc_invokeinterface

Existe una solución, pero no tiene ningún sentido, es decir, todo funciona bien si simplemente se crea una copia de la matriz doble y pasarlo a processDouble de código dinámico es decir, si el código dinámico es

testapp1.Customers temp=(testapp1.Customers)graph; 
    double[] d = temp.Dubs; 
    output.processDouble(d); 

En corto, la excepción Unhandled es lanzada por getDeclaredConstructor pero en realidad no tiene nada que ver con un constructor porque no importa si creo uno o no

Espero que mi problema y código sean lo suficientemente claros, si hay alguna confusión por favor díganlo, Gracias avance :)

Respuesta

0

La verificación se emite un error de getDeclaredConstructors porque ese es el primer lugar donde se verifican los códigos de byte en la clase c.

En cuanto a la causa del error, sospecho que tiene que ver con el hecho de que en el primer caso está pasando un doble, y en el segundo caso un doble [].

Cuestiones relacionadas