特定の Java 型の型シグネチャを(文字列として) 取得する必要があります。
たとえば、これは特定のParameterizedTypeの型シグネチャです。
Lorg/mapackage/MyClass<Ljava/lang/String;>;
Javassist で開発されているアプリケーションのコンテキストでこれが必要です。
私が探しているものをよりよく説明するために、createGetter
Javassist を使用してプライベート フィールドのゲッター メソッドを生成するメソッドの抜粋を示します。フィールドの型はパラメータ化された型です (つまり、ジェネリックを使用します)。
メソッドは最初のcreateGetter
パラメーターとしてフィールドのタイプを受け取り、2 番目のパラメーターはフィールドの名前、3 番目のパラメーターはメソッドを追加するクラスです。
public CtMethod createGetter(Type propertyType, String propertyName, CtClass ctDeclaringClass) {
CtMethod ctGetterMethod = ...
if(propertyType instanceof ParameterizedType //parameterized "single" type
|| propertyType instanceof GenericArrayType) { //parameterized array
String signature = asGenericSignature(propertyType); //MISSING PIECE OF THE PUZZLE !
ctGetterMethod.setGenericSignature(signature);
}
return ctGetterMethod;
}
たとえば、クラスがある場合
public class TestClass{
private MyClass<String> myField;
}
createGetter
次に、フィールドのメソッドを呼び出した後myField
、クラスは次のようになります。
public class TestClass{
private MyClass<String> myField;
public MyClass<String> getMyField() {
return MyClass<String> myField;
}
}
生成された getter メソッドの戻り値の型は、フィールドと同じジェネリック シグネチャを持っている必要があります (コードは、メソッドがフィールドと同じジェネリック シグネチャを持っていなくてもコンパイルできます。これは、コンパイラにとって同じクラスを持つだけで問題ないためです。それが必要な理由同じ型のジェネリック シグネチャを持つことについては、ここでは説明しません)。
メソッドのコードは、createGetter
Javassist を使用してメソッドのジェネリック型シグネチャを設定するには、最初に String などの型シグネチャを取得する必要があることを示しています (別の方法がある場合は、誰か教えてください)。フィールドとまったく同じであるため、ゲッターメソッドが持つべき正確なパラメーター化された型を知っています。しかし、私はParameterizedTypeのインスタンスのような型を持っています。
私の質問は、任意の Java Typeを指定して、これらの型シグネチャを文字列 (型パラメーター データを含む) として取得するにはどうすればよいかということです。
助けてくれてありがとう。