我在 Java 代码中有以下类:
public class CHRTreeCreator extends IndexCreator { ... }
相反,CHRTreeCreator
我想使用不同的实现,它也扩展了IndexCreator
,但我想在JRuby中对其进行编码。问题是,IndexCreator
的具体实现是根据xml配置文件选择的:
<creator>dwe.index.tree.chr.CHRTreeCreator</creator>
代码如下所示:
// className is fetched from XML
Class creatorClass = Class.forName(className);
Constructor constructor = creatorClass.getConstructor(new Class[] { });
creator = (IndexCreator) constructor.newInstance(new Object[] { });
问题是,是否可以在 Ruby 中实现它,如下所示:
class MyIndexCreator < IndexCreator
end
并以某种方式将MyIndexCreator
类名放入XML配置文件中。在这种情况下,模块-包映射如何工作?
如果无法通过Java的Class.forName加载Ruby类,我应该如何解决这个问题?
最佳答案
目前,JRuby 子类无法通过 Java 以这种方式访问,尽管它计划以某种方式用于 future 的实现(可能是 JRuby 1.5)。
一个选项(取决于您的类的 API)是创建委托(delegate):
public class RubyIndexCreator extends IndexCreator {
private IndexCreator rubyCreator;
public RubyIndexCreator() {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("ruby");
FileReader r = new FileReader("ruby_index_creator.rb");
try {
rubyCreator = engine.eval(r);
}
finally {
r.close();
}
}
public Object create(String someArg) {
return rubyCreator.create(someArg);
}
}
我忽略了一些缓存的机会,并且刚刚概述了文件读取器的管理,但希望您能明白。
在这个特定的示例中,ruby_index_creator.rb
将实现您的索引创建器类,然后返回它的一个实例 - 显然,您可以从这里引用其他 ruby 文件,并进行适当的组织:
class MyIndexer < IndexCreator
[...]
end
MyIndexer.new
就是这样!
关于java - 通过 Class.forName 从 Java 加载 JRuby 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677066/