【发布时间】: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