【问题标题】:How to get from JRuby a correctly typed ruby implementation of a Java interface?如何从 JRuby 中获取 Java 接口的正确类型的 ruby​​ 实现?
【发布时间】:2011-01-06 16:48:37
【问题描述】:

我正在尝试使用 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 类型,它不能很好地转换到我的界面。从我在网上阅读的所有内容中,我的印象是,Ruby 部分中使用java_implements 的全部目的是为了正确编译接口实现。

我做错了什么?

【问题讨论】:

    标签: java ruby class jruby jsr233


    【解决方案1】:

    应该是这样,但不幸的是还没有完全按照这种方式连接起来。目前,#java_implements#java_signature 仅由 jrubyc --java 命令使用,该命令基于 Ruby 类创建 Java 源文件。您可能需要考虑将其用于您的 Ruby 集成。

    我们的目标是让这个示例在未来同时适用于预编译脚本和运行时执行的脚本。如果您希望此脚本按预期工作,请尝试使用 include Java::some.package.ScriptDemoIf 而不是 java_implements

    【讨论】:

    • 谢谢!这确实解决了问题。我的替代方法是让加载程序执行Object l = m_engine.eval(simpleName + ".new"); Invocable i = (Invocable)m_engine; return i.getInterface(l, ScriptDemoIf.class);,这很丑……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2014-07-31
    • 2019-07-01
    • 2015-12-25
    • 1970-01-01
    • 2015-05-27
    相关资源
    最近更新 更多