0

Java Type からインスタンスを作成し、パラメータ化されたリストに入力することが可能かどうか疑問に思っていましたか?

UserDefinedTypeメンバー変数List<AnotherUserDefinedType> list(およびいくつかのプリミティブ型)を持つ Typeがあります。

(カスタム注釈を処理するために) リフレクションを使用しUserDefinedTypeて、特定の注釈を持つメンバー変数のみを処理しています。特定のプロパティが注釈に設定されている場合、それはAnotherUserDefinedTypeプリミティブ型とは対照的であるため、異なる方法で処理されることを意味します。この場合、私は で行ったことを正確に行う必要がありましたUserDefinedType

注意点は、AnotherUserDefinedTypefromのインスタンスを作成し、それらをパラメータ化されたタイプのand callField.getGenericType()に何らかの方法で追加する必要があることです。List<AnotherUserDefinedType>UserDefinedType.setAnotherUserDefinedType(List<AnotherUserDefinedType> list)

私はそれについていくつかの情報を見つけようとしましたが、今途方に暮れています。任意の支援をいただければ幸いです。

4

1 に答える 1

0

パラメーターの型自体が型パラメーターではなく、既定の引数のないコンストラクターを持つクラスである場合は、次のようにすることができます。

public class UserDefinedType {
    private List<AnotherUserDefinedType> data;

    public static void main(String[] args) throws Exception {
        UserDefinedType inst = new UserDefinedType();
        ParameterizedType type = (ParameterizedType) UserDefinedType.class.getDeclaredField("data").getGenericType();
        Class<?> clazz = (Class<?>) type.getActualTypeArguments()[0];
        Object obj = clazz.newInstance();  //this is of type "AnotherUserDefinedType"
    }
}

AnotherUserDefinedTypeただし、これはかなりひどいものであり、この場合、リフレクションなしでは (直接インスタンス化することによって) できないことは何も達成しません。たぶん、これらすべてを通して、あなたの中心的な目標が何であるかを拡張することができますか? おそらく、私たちが提案できるよりクリーンなアプローチがあるでしょう。

リスト自体がクラス型パラメーターでパラメーター化されている場合:

 public class UserDefinedType<T> {
     private List<T> data;
     //...
 }

これは不可能です。タイプ消去のため、実行時にタイプを使用できません。

したがって、基本的には、型が静的にわかっている場合にのみ可能であり、型が静的にわかっている場合は、おそらくリフレクションは必要ありません。

于 2010-11-29T19:44:23.540 に答える