Jruby rb向java生成的类继承支持或变通方法

时间:2012-09-05 23:53:33

标签: jruby

我正在尝试使用JRuby - 从ruby文件生成java。我在ruby中有一个实现Java接口的抽象类,以及扩展它的子类。也是在红宝石。

我遇到了http://jira.codehaus.org/browse/JRUBY-6342所描述的问题,其中所有生成的java文件只扩展了RubyObject。

我想知道是否有其他人遇到过此问题并有解决方法?现在我在每个子类中都使用了java_implement接口,因为它们没有扩展抽象类。

我已经包含了JRUBY-6342中描述问题的片段:

  

jrubyc --java生成的Java代码似乎不支持Ruby类继承。给出以下简单示例:

     

A班        def my_class; self.class.name结束      端

     

B级<一个      端

     

B.java中生成的类继承自RubyObject而不是A,使得B类完全被Java破坏。   在某种程度上相关的说明,模块包含似乎也不起作用。包含M的类在生成的Java代码中没有得到M的方法。

我对Ruby或JRuby的理解中遗漏了什么?

1 个答案:

答案 0 :(得分:2)

这仍然是一个问题,因为类的jruby编译器still produces RubyObject

我所知道的唯一解决方法是使用Java中的JRuby ScriptEngine来评估您的JRuby代码。例如,这里有一些JRuby代码:

require 'java'

java_import 'javax.swing.JFrame'
java_import 'javax.swing.JButton'

class MyFrame < JFrame
  def initialize
    super('Test')
    content_pane.add(JButton.new("Hello"))
    pack()
  end
end

然后可以从这样的Java类调用此代码:

import javax.swing.JFrame;

import javax.script.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {

    ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("jruby");
        Reader reader = new FileReader("myframe.rb");
        engine.eval(reader);

        // Instantiate the JRuby class, and cast the result of eval.
        JFrame frame = (JFrame) engine.eval("MyFrame.new");
        frame.setVisible(true);
    }
}

此处eval返回的对象可以投放到JFrame,就像您期望的那样。有关该问题,另请参阅this question

相关问题