我正在尝试从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
实例的推荐方法是什么?
答案 0 :(得分:2)
如果您想通过名称获取类,请使用您首选的两种方法。
ClassTag
没有为此提供任何有用的东西,而且它们不应该。特别是,您在3)中执行的ClassTag(someClass).runtimeClass
将始终返回someClass
。