Mar*_*k K 2 java jruby classloader
我在Java代码中有以下类:
public class CHRTreeCreator extends IndexCreator { ... }
Run Code Online (Sandbox Code Playgroud)
相反,CHRTreeCreator我想使用也扩展的不同实现IndexCreator,但我想在JRuby中编写代码.问题是,IndexCreator基于xml配置文件选择了具体实现:
<creator>dwe.index.tree.chr.CHRTreeCreator</creator>
Run Code Online (Sandbox Code Playgroud)
代码如下所示:
// className is fetched from XML
Class creatorClass = Class.forName(className);
Constructor constructor = creatorClass.getConstructor(new Class[] { });
creator = (IndexCreator) constructor.newInstance(new Object[] { });
Run Code Online (Sandbox Code Playgroud)
问题是,是否可以在Ruby中实现它,如下所示:
class MyIndexCreator < IndexCreator
end
Run Code Online (Sandbox Code Playgroud)
并以某种方式将MyIndexCreator类名放入XML配置文件中.在这种情况下,模块 - 包映射如何工作?
如果不能通过Java的Class.forName加载Ruby类,我该如何解决这个问题?
小智 5
目前,JRuby子类不能通过Java以这种方式访问,尽管它计划在某种程度上用于未来的实现(也许是JRuby 1.5).
一个选项(取决于您的类的API)是创建一个委托:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经掩盖了一些缓存的机会,并且还勾勒出管理文件阅读器,但希望你能得到它.
在这个特定的例子中,ruby_index_creator.rb将实现你的索引创建者类,然后返回它的一个实例 - 显然从这里你可以引用其他ruby文件,并根据需要组织:
class MyIndexer < IndexCreator
[...]
end
MyIndexer.new
Run Code Online (Sandbox Code Playgroud)
就是这样!
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |