2011-01-10 9 views
5

Próbowałem wygenerować niektóre kody dynamiczne (używając Javassist), ale program zawodzi w pewnym momencie, gdy występuje podwójna tablica lub tablica float. Kod jest następującyZweryfikuj błąd: Niespójne args_size dla 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; 
} 

Wygenerowany kod jest następujący

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

Ale problem pojawia się, gdy getDeclaredConstructors nazywa c.getDeclaredConstructors() ... zgłasza następujący błąd

wyjątek w thread "main" java.lang.VerifyError: (klasa: testapp1/Dyn, metoda: processDouble signature: (Lsomething/Output; Ljava/lang/Object;) V) Niespójne args_size dla opc_invokeinterface

Rozwiązaniem istnieje, ale nie ma żadnego sensu, to wszystko działa dobrze, jeśli po prostu utworzyć kopię podwójnej tablicy i przekazać je do processDouble w kodzie dynamicznym czyli jeśli kod dynamiczny jest

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

W krótki, wyjątek Nieobsługiwany jest generowany przez getDeclaredConstructor, ale tak naprawdę nie ma nic wspólnego z konstruktorem, ponieważ nie ma znaczenia, czy mogę go utworzyć, czy nie.

Mam nadzieję, że mój problem i kod jest wystarczająco jasny, jeśli jakieś zamieszanie, proszę powiedzieć, Dziękuję w z góry :)

Odpowiedz

0

Weryfikacja błąd jest usuwany z getDeclaredConstruktorów, ponieważ jest to pierwsze miejsce, w którym weryfikowane są bajty kodu w klasie c.

Co do przyczyny błędu, podejrzewam, że ma to związek z faktem, że w pierwszym przypadku podajesz podwójne, aw drugim przypadku podwójne [].