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

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

我的示例实现如下所示:

接口:

package some.package; import java.util.List; public interface ScriptDemoIf { int fibonacci(int d); List filterLength(List 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 filterLength(List 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” – 这只是为了简单起见)。

问题 – 我在加载器的最后一行得到一个类转换exception – engine.eval()返回一个RubyObject类型,它不能很好地转换到我的接口。 从我在网上阅读的内容来看,我认为Ruby部分中的整个使用点java_implements是为了正确编译接口实现。

我究竟做错了什么?

它应该是,但遗憾的是还没有完全接线。 目前, #java_implements#java_signature仅由jrubyc --java命令使用,该命令基于Ruby类创建Java源文件。 您可能需要考虑将其用于Ruby集成。

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