麻烦覆盖jruby中的java方法

我在从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";

  end

end


class MyRubyClass2 < Java::tabaqui.MyJavaClass

  def myMethod

    puts "Ruby method from MyRubyClass2\n";

  end

end


a = MyRubyClass1.new

a.my_method          #output: "Ruby method from MyRubyClass1"

a.invoke_my_method   #output: "Java method"


b = MyRubyClass2.new

b.my_method          #output: "Java method"

b.invoke_my_method   #output: "Ruby method from MyRubyClass2"

我发现获得预期结果(在每种情况下都调用红宝石方法)的唯一解决方案是在ruby中定义覆盖的方法后为其指定别名:


alias_method :myMethod, :my_method

难道我做错了什么?


qq_花开花谢_0
浏览 116回答 1
1回答

萧十郎

乍一看虽然令人困惑,但是一旦您了解了别名,这就是“预期的” ...MyJavaClass#myMethodmy_methodJRuby运行时将设置别名。在MyRubyClass1您重新定义my_method(别名),从而看到预期的输出。但是您没有覆盖myMethod->约定不会向后工作。而在MyRubyClass2您重新定义时myMethod,它最终会从invokeMyMethod()es进行虚拟Java调度。尽管这看起来似乎令人困惑,但Java别名约定确实适用于“裸机”使用者。而如果要扩展Java类,则应坚持使用正确的Java名称。生成代理类后,这里仍有改进的余地以重新定义Java别名,尽管这可能是一个重大更改。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java