如何访问Java jar文件类的受保护方法

时间:2017-11-07 16:15:24

标签: jruby jrubyonrails

我正在使用Java命令行应用程序(它是开源的)作为我的jrubyonrails项目的jar文件。主要应用如下

public class Decoder extends Annotator {
  public Decoder() {
    super();
  }

  public static void main(String[] args) {
    ... // Do something that I don't want
    myDesiredMethod();
    ... // And some other thing
  }
...
}

我想跳过很多步骤,我只想要myDesiredMethod功能。它是来自父protected类的Annotator方法。

public class Annotator extends Helper {
...
  protected SomeClass myDesiredMethod(boolean reMap) throws Exception { ... }
...
}

Annotator类没有任何公共构造函数,因此我不能:

ann = Annotator.new

它引发了这个错误:TypeError: no public constructors for Annotator

然后我尝试实现另一个继承Annotator的类,以便访问myDesiredMethod。这是我到目前为止尝试的jruby代码

require 'java'
require 'decoder.jar'

java_import java.util.ArrayList
java_import java.lang.StringBuilder

module MyModule
  class RuDecoder < Annotator
    include_package 'com.decoder'
    def self.my_method
        myDesiredMethod
    end
end

它返回错误:NoMethodError: undefined method 'myDesiredMethod' for MyModule::RuDecoder:Class。似乎jruby没有查找父类的方法。

在我的情况下是否有任何解决方案,我不想重建jar库并在每次更新时手动将其放入我的程序中。

1 个答案:

答案 0 :(得分:1)

事实证明我让事情过于复杂。我可以调用Annotator的默认构造函数,如下所示:

  constructors = Annotator.java_class.declared_constructors.first
  constructors.accessible = true
  annotator = constructors.new_instance.to_java

并使用简单的致电myDesiredMethodannotator.myDesiredMethod