【问题标题】:Using Scala reflection with Java reflection将 Scala 反射与 Java 反射结合使用
【发布时间】:2013-03-29 22:01:33
【问题描述】:

我有很多代码一直在使用 Java 反射来调用 Java 对象上的任意用户指定方法,作为 DSL 的一部分。

但是,实际上,这些 Java 对象中的很多都是 Scala 对象,并且它们上的一些方法标有 Scala @deprecated 注释。不幸的是,Java 的注解机制不能看到 Scala 的注解,并且在 Scala 2.10 之前没有方便的方法(我知道吗?)来访问这些注解。

我终于升级到 2.10,并且希望能够从我的 DSL 发出弃用警告。但是,我不想重写整个评估器(至少现在)以使用 Scala 反射,所以有没有一种方便的方法可以从 java.lang.reflect.Method 转到我可以使用 Scala 反射来确定是否有问题的 Scala 方法已弃用?或者我是否必须使用 Scala 反射复制大量现有的方法解析逻辑才能获得这些信息?

它看起来像以前存在于 Scala 反射中的 JavaToScala 类,其中有一个 methodToScala 方法可以满足我的要求。我能找到的唯一踪迹是here,在一个谷歌代码项目中。为什么功能从核心反射中移出?或者它仍然以不同的名称存在?

编辑:看起来有问题的代码存在于 scala.reflect.runtime.JavaMirrors 中,但不幸的是它是私有的(还有另一个 JavaMirrors 是公共 API 的一部分,但不提供我需要的任何东西。)我如果有一条通过公共 API 调用的“路径”将我一直带到私人 methodAsScala 深埋在私人 JavaMirrors 中,我无法弄清楚我的一生。至少可以这么说,这令人沮丧:(

【问题讨论】:

  • 你已经深陷反射地狱,为什么不通过反射调用私有方法呢?检查与新 scala 版本的兼容性时,这不会是您最头疼的问题。
  • 我真的只是想知道是否有一种认可的方式来做到这一点。它看起来曾经有过,但它在某个时候被转移到了私人土地上。我也不确定如何调用这些私有方法,因为它们所在的整个类都是私有的。不过,使用反射来调用反射方法会很有趣:) 不幸的是,所有方法都在一个特征中,我不确定如何获得它的实例,即使我可以反映我的方式。有什么指点吗?
  • 您必须使用getDeclaredClasses() 才能获得私人课程
  • @EugeneBurmako 谢谢!它似乎有效,但我认为我应该期待它随时中断?这个功能最终会公开还是只是将我所有的反射转移到 Scala 的反射 API 的强烈动力? :) 我想尽快做,但现在没有时间。

标签: scala reflection scala-java-interop


【解决方案1】:

这是一个快速修复(感谢@EugeneBurmako)

https://gist.github.com/xeno-by/5277805

已为此提交了一个问题(感谢 @MysteriousDan):

https://issues.scala-lang.org/browse/SI-7317

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多