小编典典

如何从JRuby获得Java接口的正确类型的ruby实现?

java

我正在尝试通过Java应用程序使用JRuby(通过JRuby 1.5中包含的JSR233接口)来加载Java接口的ruby实现。

我的示例实现如下所示:

接口:

package some.package;
import java.util.List;
public interface ScriptDemoIf {
    int fibonacci(int d);
    List<String> filterLength(List<String> source, int maxlen);
}

Ruby实现:

require 'java'
include Java

class ScriptDemo
  java_implements some.package.ScriptDemoIf
  java_signature 'int fibonacci(int d)'
  def fibonacci(d)
    d < 2 ? d : fibonacci(d-1) + fibonacci(d-2)
  end

  java_signature 'List<String> filterLength(List<String> source, int maxlen)'
  def filterLength(source, maxlen)
    source.find_all { |str| str.length <= maxlen }
  end
end

类加载器:

public ScriptDemoIf load(String filename) throws ScriptException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("jruby");
    FileReader script = new FileReader(filename);
    try {
        engine.eval(new FileReader(script));
    } catch (FileNotFoundException e) {
        throw new ScriptException("Failed to load " + filename);
    }
    return (ScriptDemoIf) m_engine.eval("ScriptDemo.new");
}

(显然,加载器在现实生活中更为通用-它不假定实现类名称为“ ScriptDemo”-这只是为了简单起见)。

问题-我在加载程序的最后一行收到了一个类强制转换异常-
engine.eval()返回的RubyObject类型不能很好地转换为我的接口。从网上阅读的所有内容中,我得到的印象是java_implements,Ruby部分的整个使用点都是为了正确编译接口实现。

我究竟做错了什么?


阅读 220

收藏
2020-11-30

共1个答案

小编典典

应该,但是不幸的是还没有那样连接。目前,#java_implements并且#java_signature仅由jrubyc --java基于Ruby类创建Java源文件的命令使用。您可能需要考虑将其用于Ruby集成。

我们的目标是将来使该示例适用于预编译脚本和运行时执行的脚本。如果您希望此脚本按预期运行,请尝试使用include Java::some.package.ScriptDemoIf代替java_implements

2020-11-30