我正在使用一个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不寻找父类的方法。
在我的例子中,有什么解决方案吗?我不想每次更新时都重新构建java库,然后手动将它放到我的程序中。
发布于 2017-11-08 10:30:26
结果我把事情搞得太复杂了。我可以按以下方式调用Annotator的默认构造函数:
constructors = Annotator.java_class.declared_constructors.first
constructors.accessible = true
annotator = constructors.new_instance.to_java并使用简单调用myDesiredMethod:annotator.myDesiredMethod
https://stackoverflow.com/questions/47162597
复制相似问题