1

特定の Java 型の型シグネチャを(文字列として) 取得する必要があります。

たとえば、これは特定のParameterizedTypeの型シグネチャです。

Lorg/mapackage/MyClass<Ljava/lang/String;>;

Javassist で開発されているアプリケーションのコンテキストでこれが必要です。

私が探しているものをよりよく説明するために、createGetterJavassist を使用してプライベート フィールドのゲッター メソッドを生成するメソッドの抜粋を示します。フィールドの型はパラメータ化された型です (つまり、ジェネリックを使用します)。

メソッドは最初の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 メソッドの戻り値の型は、フィールドと同じジェネリック シグネチャを持っている必要があります (コードは、メソッドがフィールドと同じジェネリック シグネチャを持っていなくてもコンパイルできます。これは、コンパイラにとって同じクラスを持つだけで問題ないためです。それが必要な理由同じ型のジェネリック シグネチャを持つことについては、ここでは説明しません)。

メソッドのコードは、createGetterJavassist を使用してメソッドのジェネリック型シグネチャを設定するには、最初に String などの型シグネチャを取得する必要があることを示しています (別の方法がある場合は、誰か教えてください)。フィールドとまったく同じであるため、ゲッターメソッドが持つべき正確なパラメーター化された型を知っています。しかし、私はParameterizedTypeのインスタンスのような型を持っています。

私の質問は、任意の Java Typeを指定して、これらの型シグネチャを文字列 (型パラメーター データを含む) として取得するにはどうすればよいかということです。

助けてくれてありがとう。

4

1 に答える 1

0

Eclipseは、Javaソースコードの記述子/署名を内部的に使用します。これらには、あなたに役立つかもしれない一般的な情報も含まれています。インターフェイスIMethodは、調査の開始点として適している場合があります。

于 2012-11-29T13:38:51.147 に答える