1

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);

次のようにサイズ プロパティを確認して変更するには、スクリプト変数に何を書き込む必要がありますか。

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

変更後、Java コードでプロパティの新しい値を使用できるようにしたいと考えています。

どうもありがとう!

4

2 に答える 2

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);
于 2012-12-15T18:40:34.683 に答える
1

ScriptingContainerの javadoc から直接引用

2 番目の例は、Java と Ruby の間で変数を共有する方法を示しています。この例では、ローカル変数「x」が共有されています。[...]

例 2:

    ScriptingContainer container = new ScriptingContainer();
    container.put("x", 12345);
    container.runScriptlet("puts x.to_s(2)");
于 2012-12-15T16:11:48.407 に答える