如何获取Scala的Option类,以便可以将其传递给getDeclaredMethod()

凯吉·马格努斯(KajMagnus)

我正在尝试获取classOf[the-abstract-class-Option],但是我总是获取classOf[the-Option-*object*]如何获取抽象类的类呢?

双方Option.getClassclassOf[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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何创建静态类的实例,以便可以从单独的类中调用它?

来自分类Dev

如何将对象映射到数组,以便可以将其转换为csv?

来自分类Dev

如何将Part转换为Blob,以便可以将其存储在MySQL中?

来自分类Dev

如何使我的类可迭代,以便可以使用foreach语法?

来自分类Dev

如何将向量传递给基于推力的odeint观察器的构造函数,以便可以在函子中读取它

来自分类Dev

如何使用特征哈希器转换非数字离散数据,以便可以将其传递到SVM?

来自分类Dev

如何编译ELF二进制文件以便可以将其作为动态库加载?

来自分类Dev

如何将一个类实例传递给另一个类,以便可以对其进行修改?

来自分类Dev

如何声明两个类,以便可以将它们传递给同一函数?

来自分类Dev

如何通过函数保存参数的值,以便可以将其初始值多次使用?

来自分类Dev

eth_keys如何获取字符串公钥,以便可以将其放入JSON

来自分类Dev

如何将带有值的命令行参数传递给Inno Setup Compiler,以便可以在代码中使用它们?

来自分类Dev

将@State变量传递给Class,以便可以对其进行更改

来自分类Dev

如何在Scala中处理CSV文件,以便可以将其行分成数组?

来自分类Dev

如何使std :: vector类成为Sequence,以便可以将其传递给boost :: hana :: group?

来自分类Dev

调用对象后如何更改对象,以便可以将其插入链接

来自分类Dev

是否可以将函数传递给类并进行存储,以便可以响应事件来调用它?

来自分类Dev

我如何从类的角度调用对象,以便可以在矩形中使用它

来自分类Dev

如何配置我的React-Node App,以便可以将其部署到Heroku?

来自分类Dev

如何做到这一点,以便可以从任何类访问此数组?

来自分类Dev

如何从字符串中删除引号,以便可以将其用于关联数组

来自分类Dev

如何存储列表/数组/任何类型的集合。或键入名称,以便可以将它们作为类型传递给函数

来自分类Dev

如何设置字段的值,以便可以从另一个类调用它?

来自分类Dev

如何引用原始命令,以便可以将其替换为函数

来自分类Dev

如何改进此日志类,以便可以在C#多个项目中使用它?

来自分类Dev

如何创建匿名类,以便可以将其传递给泛型构造函数?

来自分类Dev

转换字符串,以便可以将其用作范围

来自分类Dev

如何创建二叉树[3,9,20,null,null,15,7],以便可以将其传递给levelOrder方法?

来自分类Dev

如何获取当前可见活动的引用而不将其作为参数传递给其他类

Related 相关文章

  1. 1

    如何创建静态类的实例,以便可以从单独的类中调用它?

  2. 2

    如何将对象映射到数组,以便可以将其转换为csv?

  3. 3

    如何将Part转换为Blob,以便可以将其存储在MySQL中?

  4. 4

    如何使我的类可迭代,以便可以使用foreach语法?

  5. 5

    如何将向量传递给基于推力的odeint观察器的构造函数,以便可以在函子中读取它

  6. 6

    如何使用特征哈希器转换非数字离散数据,以便可以将其传递到SVM?

  7. 7

    如何编译ELF二进制文件以便可以将其作为动态库加载?

  8. 8

    如何将一个类实例传递给另一个类,以便可以对其进行修改?

  9. 9

    如何声明两个类,以便可以将它们传递给同一函数?

  10. 10

    如何通过函数保存参数的值,以便可以将其初始值多次使用?

  11. 11

    eth_keys如何获取字符串公钥,以便可以将其放入JSON

  12. 12

    如何将带有值的命令行参数传递给Inno Setup Compiler,以便可以在代码中使用它们?

  13. 13

    将@State变量传递给Class,以便可以对其进行更改

  14. 14

    如何在Scala中处理CSV文件,以便可以将其行分成数组?

  15. 15

    如何使std :: vector类成为Sequence,以便可以将其传递给boost :: hana :: group?

  16. 16

    调用对象后如何更改对象,以便可以将其插入链接

  17. 17

    是否可以将函数传递给类并进行存储,以便可以响应事件来调用它?

  18. 18

    我如何从类的角度调用对象,以便可以在矩形中使用它

  19. 19

    如何配置我的React-Node App,以便可以将其部署到Heroku?

  20. 20

    如何做到这一点,以便可以从任何类访问此数组?

  21. 21

    如何从字符串中删除引号,以便可以将其用于关联数组

  22. 22

    如何存储列表/数组/任何类型的集合。或键入名称,以便可以将它们作为类型传递给函数

  23. 23

    如何设置字段的值,以便可以从另一个类调用它?

  24. 24

    如何引用原始命令,以便可以将其替换为函数

  25. 25

    如何改进此日志类,以便可以在C#多个项目中使用它?

  26. 26

    如何创建匿名类,以便可以将其传递给泛型构造函数?

  27. 27

    转换字符串,以便可以将其用作范围

  28. 28

    如何创建二叉树[3,9,20,null,null,15,7],以便可以将其传递给levelOrder方法?

  29. 29

    如何获取当前可见活动的引用而不将其作为参数传递给其他类

热门标签

归档