【问题标题】:How to access protected method of Java jar file's class如何访问 Java jar 文件类的受保护方法
【发布时间】:2018-04-20 03:07:33
【问题描述】:

我正在使用 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 函数。它是来自父类Annotatorprotected 方法。

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 没有寻找父类的方法。

在我的情况下有什么解决方案,我不想每次更新时都将java库重建为jar并手动将其放入我的程序中。

【问题讨论】:

    标签: jruby jrubyonrails


    【解决方案1】:

    原来是我把事情弄得太复杂了。我可以调用Annotator的默认构造函数如下:

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

    并使用简单的调用myDesiredMethod:annotator.myDesiredMethod

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-26
      • 2013-04-06
      • 2011-09-18
      • 2016-05-06
      • 2014-04-17
      • 2019-08-18
      • 2017-12-09
      • 2014-05-01
      相关资源
      最近更新 更多