(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によってスローされますが、コンストラクターを作成するかどうかは関係ないため、実際にはコンストラクターとは関係ありません。
うまくいけば、私の問題とコードは十分に明確です、混乱があれば教えてください、事前にありがとう:)