scala获取运行时类的实例

时间:2018-04-15 06:26:06

标签: scala reflection casting

我正在尝试从scala中的runtimeClass获取Class[_]的实例。这将在我创建我的jar应用程序之前发生。

1)这是我使用旧java方式的简单示例,其中我试图获取StringBuilder的实例。 (在我的实际代码库中,它将是一些扩展trait EventProcessor 的类

scala> val clazz = Class.forName("scala.collection.mutable.StringBuilder")
clazz: Class[_] = class scala.collection.mutable.StringBuilder

scala> clazz.newInstance().asInstanceOf[StringBuilder].append("updating stuffs")
res1: StringBuilder = updating stuffs

2)我可以使用的另一种方法是isAssisgnableFrom

scala> val clazz = Class.forName("scala.collection.mutable.StringBuilder")
clazz: Class[_] = class scala.collection.mutable.StringBuilder

scala> if(clazz.isAssignableFrom(classOf[StringBuilder])) clazz.newInstance.asInstanceOf[StringBuilder].append("some default data") 
       else throw new Exception(s"$clazz is not what i want")
res2: StringBuilder = some default data

3)但是我试图获取runtimeClass ,如果没有快速失败则获取正确类型的实例。

我在scala ClassTag[_]上发现了数百个帖子,但无法按照我想要的方式运行。也许asInstanceOf[T]是我想要的最佳方法。

使用ClassTag的一个示例,我仍然需要执行asInstanceOf[T]。如果是这样,那么与旧asInstanceOf[T]相比有什么优势。

scala> ClassTag[StringBuilder](Class.forName("scala.collection.mutable.StringBuilder"))
res2: scala.reflect.ClassTag[StringBuilder] = scala.collection.mutable.StringBuilder

scala> res2.runtimeClass.newInstance.asInstanceOf[StringBuilder].append("update state")
res3: StringBuilder = update state

上面的误导是我可以向ClassTag提供错误的Type,如下所示,

scala> ClassTag[Int](Class.forName("scala.collection.mutable.StringBuilder")).runtimeClass
res4: Class[_] = class scala.collection.mutable.StringBuilder

我的问题是在scala中获取runtimeClass实例的推荐方法是什么?

1 个答案:

答案 0 :(得分:2)

如果您想通过名称获取,请使用您首选的两种方法。

ClassTag没有为此提供任何有用的东西,而且它们不应该。特别是,您在3)中执行的ClassTag(someClass).runtimeClass将始终返回someClass