我正在尝试通过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”-这只是为了简单起见)。
问题-我在加载程序的最后一行收到了一个类强制转换异常-
engine.eval()返回的RubyObject类型不能很好地转换为我的接口。从网上阅读的所有内容中,我得到的印象是java_implements,Ruby部分的整个使用点都是为了正确编译接口实现。
我究竟做错了什么?