如何获得Scala';s选项类,以便我可以将其传递给getDeclaredMethod()

如何获得Scala';s选项类,以便我可以将其传递给getDeclaredMethod(),scala,generics,Scala,Generics,我试图获得[the abstract class Option]的类,但我总是得到[the Option-*object*]的类。我怎样才能得到抽象类的类呢 Option.getClass和classOf[Option[\u]]都给了我class scala.Option$ 编辑:我不必问这个问题;突然间,classOf[Option[\u]]工作正常,很奇怪/Edit 背景: 我正试图通过反射调用一个采用选项[String]参数的方法。 它的签名看起来是这样的:…(…,anySectionId

我试图获得[the abstract class Option]的
,但我总是得到[the Option-*object*]的
。我怎样才能得到抽象类的类呢

Option.getClass
classOf[Option[\u]]
都给了我
class scala.Option$

编辑:我不必问这个问题;突然间,
classOf[Option[\u]]
工作正常,很奇怪/Edit

背景:

我正试图通过反射调用一个采用
选项[String]
参数的方法。
它的签名看起来是这样的:
…(…,anySectionId:Option[String],…)…

在调用该方法之前,我通过
getDeclaredMethod
查找它。但要做到这一点,我需要一个参数类型的列表,我通过调用
\uuu.getClass
对我将要给该方法的每个参数进行构造。但是,对于选项实例,
\uU4.getClass
返回
classOf[None]
classOf[Some]
,这使得
getDeclaredMethod
失败,因为(?)签名基于的是选项而不是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: _*)

对于带有任何
选项的方法,上面最后一行失败(否则一切正常)。

回答:
classOf[Option[\u]]

奇怪!突然
classOf[Option[\u]]
起作用了。我确信我在提交问题之前测试了一两次:-(也许IDE在我重新编译之前没有时间保存文件,真奇怪


我不知道我是否应该删除这个问题。或者我应该让它保持原样,以防[Option[\u]]]
的类对每个人都不明显。

最好的方法是使用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
或者根据poor man的重载解决方案过滤参数数量,然后过滤所有具有一致类型的参数

意外获取对象的符号实际上是:

scala> classOf[Option$]
res8: Class[Option$] = class scala.Option$

我讨厌这种情况。谢谢!这更简单。现在我的代码看起来是这样的:
viewClass.getMethods.find(\uu.getName==“apply”)getOrDie“DwE74hG0X3”