9

次のシナリオを想像してみてください。

class MyClass extends OtherClass<String>{

   String myName;
   //Whatever

}

class OtherClass<T> {

   T myfield;

}

そして、特にリフレクションを使用してMyClassを分析して(MyClass.class).getDeclaredFields()います。この場合、次のフィールド(および、フィールドのgetType()を使用してTypes)を取得します。

myName --> String
myField --> T

拡張表記の明示的な「文字列」により実行時に認識されるTの実際のタイプを取得したいのですが、非遺伝型のmyFieldを取得するにはどうすればよいですか?

解決済みの編集:

答えは「できない」のようです。後でこの質問を見る可能性がある人には、Jacksonを使用して(JSONを生成するためにこれを実行しようとしていました)、Jacksonが継承階層を認識し、自動的に何を実行できるようにクラスとフィールドに注釈を付けることをお勧めします以下の正解が提案されました。

4

6 に答える 6

26

これは、明示的に を使用したという理由だけでリフレクションを使用して実現できますString。そうしないと、型の消去によりこの情報が失われてしまいます。

ParameterizedType t = (ParameterizedType) MyClass.class.getGenericSuperclass(); // OtherClass<String>
Class<?> clazz = (Class<?>) t.getActualTypeArguments()[0]; // Class<String>
于 2012-06-22T22:39:34.503 に答える
1

これは、リフレクションが優れたアイデアではない理由の典型的な例です。

リフレクションによってプログラムから取得できるのは、その言語のコンパイラ担当者が利用可能にすることを選択した事実だけです。

また、一般的に、すべてを利用できるようにする余裕はありません。彼らは生のプログラムテキストを保持しなければならないでしょう。

したがって、コードに関する他のすべての事実は、反射者には利用できません。

これを解決するには、言語のに出て、コードに関する任意の情報を提供できるツールを使用します。このようなツールは、Program Transformation Systems (PTS)と呼ばれます。

PTS はソース コードを解析し、それを表す AST を構築します。優れた PTW は、本質的にコードに関するすべて (演算子、オペランド、句読点、コメント) を保持する AST を構築して、検査できるようにします。通常、PTS は言語トークンの行/列位置を記録するため、レイアウト情報も利用できます。極端な PTS は、トークン間のギャップに空白を記録するか、少なくとも要求された場合に必要なときに元のテキスト ファイルを読み取る方法を知っています。この AST は本質的に、私が必要だと述べた全文に相当しますが、より処理しやすい形になっています。

(PTS には、もう 1 つの非常に優れたプロパティがあります。AST を変更し、変更されたプログラムのコードを再生成できます。ただし、これは反映を超えているため、この側面についてはこれ以上コメントしません)。

于 2016-07-20T13:02:31.357 に答える
0

ジェネリック型は実行時に認識されません。コンパイラだけがそれらを認識し、プログラムが正しく型付けされていることを確認してから、それらを削除します。

MyClass.class.getGenericSuperclass()特定のケースでは、何らかの奇妙な理由で、継承時に使用される具象型がクラス記述子に保持されるため、呼び出すと必要な情報が得られる場合があります。

于 2012-06-22T22:15:23.970 に答える
-5

Type Erasureのため、実際の型を直接取得する方法はありません。ただし、次の方法を使用できます。

OtherClass<T>、次の抽象メソッドを記述します。

protected abstract class<T> getClazz();

次にMyClass、メソッドを実装します。

@Override
protected Class<String> getClazz(){
    return String.class;
}

その後、呼び出しgetClazz()てクラスを取得できます。

于 2012-06-22T22:14:32.803 に答える