我正在尝试获取classOf[the-abstract-class-Option]
,但是我总是获取classOf[the-Option-*object*]
。我该如何获取抽象类的类呢?
双方Option.getClass
并classOf[Option[_]]
给了我class scala.Option$
。
编辑:我不需要问这个;突然间,classOf[Option[_]]
效果很好,很奇怪。/编辑
背景:
我试图通过反射调用一个带有Option[String]
参数的方法。
它的签名看起来像这样:...(..., anySectionId: Option[String], ...)...
在调用该方法之前,我先通过查找了它getDeclaredMethod
。但是要做到这一点,我需要一个参数类型列表,通过调用_.getClass
要提供给该方法的每个参数来构造这些参数类型。但是对于Option实例,则_.getClass
返回classOf[None]
或失败classOf[Some]
,这会getDeclaredMethod
失败,因为(?)签名基于Option而不是Some / None。
这是代码:
val clazz: Class[_] = Play.current.classloader.loadClass(className)
val paramTypes = arguments.map(_ match {
case None => Option.getClass // gives me the object, not the abstract class
case _: Some[_] => classOf[Option[_]] // this also gives me the object :-(
case x => x.getClass // results in None or Some for Option instances
})
val m: jl.reflect.Method = clazz.getDeclaredMethod("apply", paramTypes: _*)
并且上面的最后一行对于具有任何Option
参数的方法均失败(否则一切正常)。
最好的方法是使用Scala反射。
第二个最好的方法是不要通过尝试匹配参数类型来使自己工作。
getClass
对子类型使用失败:
scala> class Foo
defined class Foo
scala> class Bar extends Foo
defined class Bar
scala> class Baz { def baz(f: Foo) = 1 }
defined class Baz
scala> val b = new Baz
b: Baz = Baz@d33eaa9
scala> val p = new Bar
p: Bar = Bar@406c5ca2
scala> classOf[Baz].getDeclaredMethod("baz", p.getClass)
java.lang.NoSuchMethodException: Baz.baz(Bar)
仅需匹配名称即可:
scala> classOf[Baz].getMethods.find(_.getName == "baz") map (_.invoke(b,p)) getOrElse -1
res5: Any = 1
或过滤可怜人的重载分辨率的参数数量,然后过滤所有具有符合类型的参数。
实际上,意外获取对象的表示法是:
scala> classOf[Option$]
res8: Class[Option$] = class scala.Option$
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句