特殊なフィールドを持ち、生のデータ型を使用しているクラスがあります。たとえば、Tuple2 [Int、String]:
scala> class TupleReflection(val tuple: Tuple2[Int, String])
defined class TupleReflection
scala> val refl = new TupleReflection((5, "hello"))
refl: TupleReflection = TupleReflection@1a597ec8
ここでリフレクションを使用して、「refl」インスタンス内のTuple2の型パラメーターを見つけたいと思います。(フィールドを取得するために「head」を使用して少しごまかします。これが唯一のフィールドであることがわかっているためです。)
scala> val field = refl.getClass.getDeclaredFields.head
field: java.lang.reflect.Field = private final scala.Tuple2 TupleReflection.tuple
これでフィールドができたので、ジェネリック型を照会できます。
scala> field.getGenericType
res41: java.lang.reflect.Type = scala.Tuple2<java.lang.Object, java.lang.String>
ここでの問題は、最初のタイプがオブジェクトであるということです。反射だけで、そのパラメーターの実際の型(Int)を知る方法はありますか?
アップデート:
私はこれを自分のAPI内の自動シリアル化のコンテキストで使用しています。@Serializableでマークされたクラスが与えられた場合、それをシリアル化できます。そのためには、リフレクションを使用してクラスのフィールドとタイプのツリーを再帰的に構築し、深いシリアル化を実行できるようにする必要があります。
@Specializedクラスを直接操作している場合、型は明示的であり、呼び出しサイトでのコンパイル時に認識されているため、機能します。階層内のフィールドが@specializedの場合、リフレクションを介して判断する方法はありません。クラスで宣言されたフィールドまたはメソッドをクエリしても、正しい値は得られません。タイプは実行時に存在しますが、フィールド自体の宣言ではなく、フィールドに保持されているインスタンスにのみ存在します。したがって、インスタンスがnullで、「getClass」を実行できない場合、リフレクションだけでは正しいタイプを知ることができません。