Ошибка проверки: Несоответствующий размер args_size для opc_invokeinterface - PullRequest
5 голосов
/ 10 января 2011

Я пытался сгенерировать несколько динамических кодов (используя 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)
{
        // 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 подпись: (Lsomething / Output; Ljava / lang / Object;) V) Несоответствующий размер args_size для opc_invokeinterface

Обходной путь существует, но не имеет никакого смысла, то есть все работает нормально, если я просто создаю копию двойного массива и передаю ее процессу processDouble в динамическом коде т.е. если динамический код

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

Короче говоря, исключение Unhandled генерируется getDeclaredConstructor, но на самом деле оно не имеет ничего общего с конструктором, поскольку не имеет значения, создаю я его или нет

Надеюсь, моя проблема и код достаточно ясны, если возникнет путаница, пожалуйста, скажите, заранее спасибо:)

1 Ответ

0 голосов
/ 27 мая 2011

Ошибка проверки выдается из getDeclaredConstructors, потому что это первое место, где проверяются байтовые коды в классе C.

Что касается причины ошибки, я подозреваю, что это связано с тем, что вв первом случае вы передаете двойной, а во втором случае двойной [].

...