1

我有一个带有 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 中工作而无需大规模重新实现。

4

1 回答 1

2

您可以调用私有方法(使用 Java 的反射)...但是您将无法在原始 Java 类(仅在 JRuby 端)上将其公开,因此您不能使用super...调用它样本 :

>> 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'

现在让我们做一些 Java 反射来调用(Java)私有signInt方法:

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

然后再试一次 :

>> big_int.sign_int
=> 0
于 2013-09-22T12:48:01.983 回答