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

标签 java jruby classloader

我在 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/

相关文章:

java - 在一个类中设置多个对话框并在其中一个对话框上设置 TextView

java - 分配空字符时会发生什么?

Java 从类类型实例化一个对象

ruby - 如果变量 "p"没有明确定义,它在 ruby​​ 中从哪里获取它的值?

ruby-on-rails - 我怎样才能弄清楚为什么我的 JRuby Rails 应用程序需要很长时间才能提供页面?

ruby-on-rails - ActiveRecord 不缺常数 Base!将 rails 3.2.9 jruby 1.7.2 部署到 weblogic 10.3 时出错

java - JBoss中的类加载顺序

java - 应用程序决定jar版本

java - 获取两个 arrayList 之间的差异,但以大写形式比较它们

java - 解决OSGi环境下 "loader constraint violation"上的 "org.w3c.dom.Node"错误