在JRuby中使用现有的Java对象

时间:2012-12-15 16:07:25

标签: java jruby

有人能说我,我应该如何在JRuby脚本中使用现有的Java对象?

我知道如何在JRuby中创建一个Java类的新实例,但在我的情况下,我已经有一个Java实例,我想在我的JRuby脚本中检查/修改它的一些属性。

//Java

public class MyClass 
{
private int size;

public int getSize() {
    return size;
}

public void setSize(int size) {
    this.size = size;
}
}

//...

MyClass myClass = new MyClass();
myClass.setSize(5);

//...

String script = "..????.."
ScriptingContainer rubyContainer = new ScriptingContainer();
rubyContainer.runScriptlet(script);

我应该在脚本变量中写什么来检查和修改size属性,如下所示:

if (myClass.getSize() > 3)
    myClass.setSize(10)
else
    myClass.setSize(0);

修改后,我希望能够在我的Java代码中使用该属性的新值。

非常感谢!

2 个答案:

答案 0 :(得分:1)

直接来自ScriptingContainer

的javadoc
  

第二个例子展示了如何在Java和Ruby之间共享变量。在此示例中,共享局部变量“x”。 [...]

     

示例2:

    ScriptingContainer container = new ScriptingContainer();
    container.put("x", 12345);
    container.runScriptlet("puts x.to_s(2)");

答案 1 :(得分:1)

问题解决了,非常感谢你的帮助!

设置“LocalVariableBehavior.PERSISTENT”以便在多次评估期间使用该对象非常重要。处理完脚本后,Java代码中对象的值与JRuby脚本中的相同。

//Java

rubyContainer = new ScriptingContainer(LocalVariableBehavior.PERSISTENT);
rubyContainer.put("myClass", myClass);

String script = 
    "if myClass.getSize() > 3 then " +
    "myClass.setSize(10) " +
    "else " +
    "myClass.setSize(0)" +
    "end";

rubyContainer.runScriptlet(script);