使用Scala反射与Java反射

9

我有很多代码使用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进行调用的“路径”,可以将我带到深埋在私有JavaMirrors中的私有methodAsScala。这真是令人沮丧,至少可以这么说 :(

1
你已经深陷于反射地狱中,为什么不通过反射调用私有方法呢?这样做在检查新的Scala版本兼容性时也不会成为你最头疼的问题。 - Denis Tulskiy
我只是想知道是否有一种官方认可的方法来做这件事。看起来以前有过,但在某个时候被移动到了私有领域。我也不确定如何调用那些私有方法,因为它们所在的整个类都是私有的。虽然使用反射调用反射方法可能有点有趣 :) 不幸的是,所有的方法都在一个trait中,即使我能够通过反射进入,我也不确定如何获取它的实例。有什么指针吗? - Mysterious Dan
1
你需要使用 getDeclaredClasses() 来获取私有类。 - Denis Tulskiy
1
https://gist.github.com/xeno-by/5277805 - Eugene Burmako
1
@EugeneBurmako 谢谢!看起来它能工作,但我应该预计它随时可能会出问题吗?这个功能最终会公开吗,还是只是一个强烈的动力,让我把所有反射都转移到Scala的反射API上? :) 我想尽快做到这一点,但现在没有时间。 - Mysterious Dan
显示剩余3条评论
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接