gpt4 book ai didi

java - 通过 Class.forName 从 Java 加载 JRuby 类

转载 作者:行者123 更新时间:2023-11-30 06:38:55 25 4
gpt4 key购买 nike

我在 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 以这种方式访问​​,尽管它计划在未来的实现中以某种能力(可能是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com