2012-12-15 5 views
1

JRuby 스크립트에서 기존 Java 객체를 어떻게 사용해야합니까?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 코드에서.

고맙습니다.

답변

1

스트레이트 ScriptingContainer

의 자바 독에서 두 번째 예는 자바 루비 사이의 변수를 공유하는 방법을 나타낸다. 이 예에서 지역 변수 "x"는 공유됩니다. [...]

예 2 :

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

하지만이 경우 Java 코드에서 수행합니다. 필자의 경우에는 JRuby 스크립트 만 사용하여 기존 Java 객체를 얻을 수 있다는 것을 알아야합니다. 타이머가 있고 매 x 초마다 rubyContainer.runScriptlet (스크립트)을 실행한다고 가정 해 보겠습니다. Java에서 다른 작업을 수행하지 않고 새로운 검사/수정을 수행합니다. – Anton

+0

나는이 문제를 이해하지 못한다. 질문을 편집하고 타이머로하고 싶은 것을 보여주십시오. –

+0

Java 코드 (int myInt = 5)에 변수가 있다고 가정합니다. 나는이 변수를 JRuby에서 얻을 수 있기를 원한다. ScriptingContainer를 시작하고 함수의 runScriptlet (스크립트)을 호출합니다. 질문은 그것을 확인/수정하기 위해 myInt에 접근하기 위해 스크립트 변수에 무엇을 써야 하는가? – Anton

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); 
관련 문제