我有一个带有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中工作。
答案 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