をサブクラス化するとき、私は以下の持っている場合はジェネリックにクラスを割り当てることが可能ですそれが唯一の可能な行うには:ByteBuddy、パラメータ化クラス
DynamicType.Unloaded<Parameterized> subclassed = new ByteBuddy()
.subclass(Parameterized.class).make();
をサブクラス化するとき、私は以下の持っている場合はジェネリックにクラスを割り当てることが可能ですそれが唯一の可能な行うには:ByteBuddy、パラメータ化クラス
DynamicType.Unloaded<Parameterized> subclassed = new ByteBuddy()
.subclass(Parameterized.class).make();
Javaでジェネリックは上Parameterized<MyClass>
、using type erasure実装されているのでコンパイル時には本当に存在します。実行時にはParameterized
しかありません。
したがって、これにはわずかな用途しかありません。 K5_'s answerをご覧ください。
インスタンスのタイプ情報のみが消去されます。参考文献ではない。用途に応じて、(生の型を拡張するのではなく)正しいパラメータで実際に拡張するといくつかの利点が得られるかもしれません。
あなたはByteBuddyでそれを行う方法のthats:実行時に型パラメータを抽出する/使用しての
Class<?> subclass = new ByteBuddy()
.subclass(TypeDescription.Generic.Builder.parameterizedType(Parameterized.class, MyClass.class).build())
.make()
.load(Parameterized.class.getClassLoader())
.getLoaded();
一つの方法は、次のようになります。
Paramerized<MyClass> instance = (Paramerized<MyClass>) subclass.getConstructor().newInstance();
if (instance.getClass() instanceof ParameterizedType) {
ParameterizedType para = (ParameterizedType) instance.getClass().getGenericSuperclass();
System.out.println(para.getActualTypeArguments()[0]);
}
フレームワークの開発の外の多くの用途がありませんが、可能です。例えば、 –
。 Hibernateはあなたのコレクションをロードするときに正しいデータベースクエリをトリガするためにリストに 'YourBean'インスタンスが含まれていることを知る必要があります。これにより、実行時ジェネリックが便利になります。 –