5

(Javassistを使用して)いくつかの動的コードを生成しようとしましたが、double配列またはfloat配列を含む場合、プログラムは特定の時点で失敗します。コードは次のとおりです

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:processDoublesignature:(Lsomething / Output; Ljava / lang / Object;)V)opc_invokeinterfaceのargs_sizeに一貫性がありません

回避策は存在しますが、意味がありません。つまり、double配列のコピーを作成し、それを動的コードのprocessDoubleに渡すだけで、つまり動的コードが

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

要するに、例外UnhandledはgetDeclaredConstructorによってスローされますが、コンストラクターを作成するかどうかは関係ないため、実際にはコンストラクターとは関係ありません。

うまくいけば、私の問題とコードは十分に明確です、混乱があれば教えてください、事前にありがとう:)

4

1 に答える 1

0

検証エラーはgetDeclaredConstructorsからスローされます。これは、クラスcのバイトコードが最初に検証される場所だからです。

エラーの原因については、最初のケースではdoubleを渡し、2番目のケースではdouble[]を渡しているという事実に関係しているのではないかと思います。

于 2011-05-27T02:18:48.730 に答える