验证错误:opc_invokeinterface的args_size不一致

Bas*_*wer 5 java javassist

我一直在尝试生成一些动态代码(使用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;
}
Run Code Online (Sandbox Code Playgroud)

生成的代码如下

    testapp1.Customers temp=(testapp1.Customers)graph;
    output.processDouble(temp.Dubs[1]);
Run Code Online (Sandbox Code Playgroud)

但是当getDeclaredConstructors被调用c.getDeclaredConstructors()时会出现问题...它会抛出以下错误

例外在线程 "主" java.lang.VerifyError的:(等级:testapp1 /强啡肽,方法:processDouble签名:(Lsomething /输出; Ljava /郎/对象;)V),用于opc_invokeinterface不一致args_size

一种解决方法,但没有任何意义,即一切工作正常,如果我只需要创建一个双数组的一个拷贝,并把它传递给processDouble在IE动态代码,如果动态代码

    testapp1.Customers temp=(testapp1.Customers)graph;
    double[] d = temp.Dubs;
    output.processDouble(d);
Run Code Online (Sandbox Code Playgroud)

简而言之,getDeclaredConstructor抛出异常Unhandled,但它实际上与构造函数无关,因为如果我创建一个或者没有

希望我的问题和代码足够清楚,如果有任何混淆请告诉,谢谢你提前:)

Hot*_*cks 0

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

至于错误的原因,我怀疑这与以下事实有关:在第一种情况下,您传递了一个 double,而在第二种情况下,您传递了一个 double[]。