在Java中,虽然在运行时删除了类型实参,但可以找到传递给超类的实际类型实参:
class Derived extends Base<String> {
// ...
}
ParameterizedType type = (ParameterizedType)Derived.class.getGenericSuperclass();
Type[] args = type.getActualTypeArguments(); // gives {String.class}
虽然我可以对Scala类使用相同的Java反射,但它不能捕获Scala的值类型:
class Base[T]
class Derived extends Base[Int]
classOf[Derived]
.getGenericSuperclass
.asInstanceOf[ParameterizedType]
.getActualTypeArguments // gives {Object.class}, not {int.class}
从通用超类扩展时,是否可以确定使用的值类型?我正在从jar文件加载类,因此最好仅使用java.lang.Class
实例来实现这一点。
在Java反射中,您将无法获得Int
和其他AnyVal
类型,因为它们由编译器专门处理,并且如果它们被通用使用,它们将由表示Object
。但是,您可以使用Scala反射,并且完全有可能从Java反射转到Scala反射。这是如何做:
import scala.reflect.runtime.universe._
class Base[T]
class Derived extends Base[Int]
object Main extends App {
val rm = runtimeMirror(getClass.getClassLoader) // whatever class loader you're using
val derivedSym = rm.staticClass(classOf[Derived].getName)
val baseSym = rm.staticClass(classOf[Base[_]].getName)
val TypeRef(_, _, params) = derivedSym.typeSignature.baseType(baseSym)
println(s"$derivedSym extends $baseSym[${params.mkString(", ")}]")
}
不幸的是,除非您确切地知道要搜索的内容,否则将很难找到合适的文档。我已经在scala-users邮件列表中找到了答案。Scala反射仍处于试验阶段,而且AFAIK可能会在以后的Scala版本中将其替换为更好的反射。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句