我在从jruby类覆盖Java方法时遇到了一些麻烦。由于JRuby公开了同时使用驼峰和蛇格语法的Java方法,因此我尝试了两种方法来覆盖相同的方法,但结果却很奇怪:爪哇package tabaqui;class MyJavaClass { public void myMethod() { System.out.println("Java method"); } public void invokeMyMethod() { myMethod(); }}红宝石class MyRubyClass1 < Java::tabaqui.MyJavaClass def my_method puts "Ruby method from MyRubyClass1\n"; endendclass MyRubyClass2 < Java::tabaqui.MyJavaClass def myMethod puts "Ruby method from MyRubyClass2\n"; endenda = MyRubyClass1.newa.my_method #output: "Ruby method from MyRubyClass1"a.invoke_my_method #output: "Java method"b = MyRubyClass2.newb.my_method #output: "Java method"b.invoke_my_method #output: "Ruby method from MyRubyClass2"我发现获得预期结果(在每种情况下都调用红宝石方法)的唯一解决方案是在ruby中定义覆盖的方法后为其指定别名:alias_method :myMethod, :my_method难道我做错了什么?
1 回答
![?](http://img1.sycdn.imooc.com/54584f6d0001759002200220-100-100.jpg)
萧十郎
TA贡献1815条经验 获得超13个赞
乍一看虽然令人困惑,但是一旦您了解了别名,这就是“预期的” ...
MyJavaClass#myMethod
my_method
JRuby运行时将设置别名。
在MyRubyClass1
您重新定义my_method
(别名),从而看到预期的输出。但是您没有覆盖myMethod
->约定不会向后工作。
而在MyRubyClass2
您重新定义时myMethod
,它最终会从invokeMyMethod()
es进行虚拟Java调度。
尽管这看起来似乎令人困惑,但Java别名约定确实适用于“裸机”使用者。而如果要扩展Java类,则应坚持使用正确的Java名称。生成代理类后,这里仍有改进的余地以重新定义Java别名,尽管这可能是一个重大更改。
添加回答
举报
0/150
提交
取消