JRuby课程& Java基类:使子类可以使用私有java方法

时间:2013-09-19 22:38:18

标签: jruby fxml

我有一个带有Java父类的JRuby子类。我需要覆盖Java函数,以便在调用它时首先调用JRuby方法实现。问题是java方法是私有的。有什么想法吗?*

// Java:
public class JavaClass {
     private void check(String what) {
          System.out.println(what);
     }
}

# JRuby:
class RubyClass < JavaClass
  def check() # => private above.  any way to force it public
    super("RubyClass.check was called first")
  end
end

*我知道这通常不是一个好主意。我试图让FXMLLoader在没有批量重新实现的情况下在JRuby中工作。

1 个答案:

答案 0 :(得分:2)

你可以调用私有方法(使用Java的反射)...但你不能在原始Java类(仅在JRuby端)上公开它,因此你不能使用{{ 1}} ...这是一个样本:

super

现在让我们做一些Java反射来调用(Java)私有>> big_int = Java::JavaMath::BigInteger.new '42' => #<Java::JavaMath::BigInteger:0x787faefa> >> big_int.signInt NoMethodError: undefined method `signInt' for #<Java::JavaMath::BigInteger:0x787faefa> from (irb):6:in `evaluate' 方法:

signInt

再试一次:

class Java::JavaMath::BigInteger
  def sign_int
    signInt = java_class.declared_method :signInt
    signInt.accessible = true
    signInt.invoke(self)
  end
end