【发布时间】:2012-07-20 04:17:02
【问题描述】:
我有一个类,它有一个专门的字段并且使用原始数据类型。例如一个 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>
现在的问题是第一个类型是Object。有没有办法仅通过反射知道该参数的真实类型(Int)?
更新:
我在我自己的 API 中的自动序列化上下文中使用它。给定一个标有@Serializable 的类,我可以对其进行序列化。为此,我必须使用反射递归地构建类的字段和类型树,以便进行深度序列化。
如果我直接使用 @Specialized 类,它可以工作,因为类型是显式的并且在调用站点的编译时已知。如果层次结构中的字段是@specialized,我无法通过反射来判断。查询类中声明的字段或方法不会产生正确的值。该类型存在于运行时,但仅存在于字段中保存的实例上,而不存在于字段本身的声明中。因此,如果实例为 null 并且无法执行“getClass”,我无法仅通过反射知道正确的类型。
【问题讨论】:
标签: scala reflection specialized-annotation