次のコードのようにフィールドを宣言できます。フィールドをパラメータ付きリストとして宣言するJavaアシスト
evalClass.addField(CtField.make("private java.util.List abc;", evalClass));
Javaアシストを使用してフィールドList<String> abc
を宣言するにはどうすればよいですか?
次のコードのようにフィールドを宣言できます。フィールドをパラメータ付きリストとして宣言するJavaアシスト
evalClass.addField(CtField.make("private java.util.List abc;", evalClass));
Javaアシストを使用してフィールドList<String> abc
を宣言するにはどうすればよいですか?
CtFieldクラスについて少し研究を行った。 setGenericSignatureで設定できます。
CtField f = new CtField(pool.get(List.class.getCanonicalName()), "abc", evalClass);
f.setGenericSignature(getGenericSignature(relatedClass));
evalClass.addField(f);
private String getGenericSignature(Class relatedClass) throws BadBytecode {
String fieldSignature = "L" + List.class.getCanonicalName().replace(".", "/") + "<L" + String.class.getCanonicalName().replace(".", "/") + ";>;";
return SignatureAttribute.toClassSignature(fieldSignature).encode();
}
まず、ジェネリックはJavassistでサポートされていません。 Javassistのdocumentationから :
ジェネリック
Javassistのの低レベルAPIが完全一方 のJava 5で導入されたジェネリックをサポートし、このようなCtClassは と同様に、より高いレベルのAPIジェネリックを直接サポートしていません。しかし、これはバイトコード変換のための深刻な問題ではない。 。
Javaのジェネリックは消去技術によって実装されています。 のコンパイル後、すべての型パラメータは削除されます。あなたは、あなたがバイトコード変換プログラムを書く ので
Vector v = new Vector(); String s = (String)v.get(0);
:
Vector<String> v = new Vector<String>(); String s = v.get(0);
コンパイルしたバイトコードは次のコードと同等です:たとえば、あなたのソースコードは、パラメータ化された型のベクトルを宣言 を想定すべてのタイプを落とすことができます パラメータ。 Javassistに埋め込まれたコンパイラは をサポートしていないため、をサポートしているため、 CtMethod.make()などのソースコードがJavassistによってコンパイルされている場合は、 サイトの呼び出し側で明示的な型キャストを挿入する必要があります。 javacなどの通常のJavaコンパイラでコンパイルされたソースコードが の場合は、型キャストは必要ありません。
ですから、基本的に一般的な仕様ずにリストを追加するために、あなたがあなたの質問にWROT方法を使用することができますし、それはだつもり作業を行う