繁体   English   中英

通过Class.forName从Java加载JRuby类

[英]loading JRuby classes from Java by Class.forName

我在Java代码中有以下课程:

public class CHRTreeCreator extends IndexCreator { ... }

取而代之的是CHRTreeCreator我想使用不同的实现,它也扩展了IndexCreator ,但是我想用JRuby对其进行编码。 问题是,基于xml配置文件选择IndexCreator特定实现:

<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 1.5),但无法以这种方式通过Java访问JRuby子类。

一种选择(取决于您的类的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);
  }
}

我已经介绍了一些缓存的机会,还概述了如何管理文件读取器,但希望您能理解。

在此特定示例中, ruby_index_creator.rb将实现您的索引创建者类,然后返回其实例-显然,从这里您可以引用其他ruby文件,并进行适当的组织:

class MyIndexer < IndexCreator
 [...]
end
MyIndexer.new

就是这样!

作为替代,也许您可​​以利用Ruby的Open Classs并直接修改CHRTreeCreator的行为(与子类相对)。

如何使用ruby eval:

C:\>jirb
irb(main):001:0> require 'java'
=> false
irb(main):002:0> class MyDate < Java::JavaUtil::Date
irb(main):003:1> def my_method;puts "hi there";end
irb(main):004:1> end
=> nil
irb(main):005:0>
irb(main):006:0* c = "MyDate"
=> "MyDate"
irb(main):007:0> obj = eval("#{c}.new")
=> #<MyDate:0xd2efa1>
irb(main):008:0> obj.my_method
hi there
=> nil
irb(main):009:0>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM