4

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

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

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

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

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

A类定义my_class;self.class.name end end

B类<A结束

B.java 中生成的类继承自 RubyObject 而不是 A,使得 B 类在 Java 中完全被破坏。在一些相关的说明中,模块包含似乎也不起作用。包含 M 的类不会在生成的 Java 代码中获取 M 的方法。

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

4

1 回答 1

2

这仍然是一个问题,因为 jruby 编译器仍然为类生成 RubyObject

我知道的唯一解决方法是使用ScriptEngineJava 中的 JRuby 来评估您的 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,正如您所期望的那样。有关该问题,另请参阅问题。

于 2012-09-06T13:17:17.723 回答