납득시키려면 어떻게 해야 할까 GroovyShell 상태를 유지해 eval()호출은?

StackOverflow https://stackoverflow.com/questions/45582

문제

내가 사용하려고 그루브를 만들 수 있는 대화 스크립트/매크로드에 대한 내 응용 프로그램이 있습니다.응용 프로그램은 OSGi 고 많은 정보를 스크립트가 필요할 수 있는지 알고 있습니다.나는 사용할 수 있습 GroovyShell 및 전화 eval()여러 번 지속적으로 추가하는 네임스페이스로 OSGi 번들로드됩니다.GroovyShell 유지 변수 상태를 통해 여러 eval 호출하지만,클래스 정의는 방법이 있습니다.

목표:만들기 기본 클래스를 시작하는 동안.로 OSGi 번들로드,파생된 클래스를 만들로 필요합니다.

도움이 되었습니까?

해결책 2

결국 코드를 주입하기 전에 각 스크립트를 컴파일할 수도 있습니다.최종 목표는 사용자가 스크립트 작성을 도메인 특정 언어를 사용할 수 있습니다.

다른 팁

나는 확실하지 않은 것에 대해 의미에 대해 선언되지 않은 클래스는 기존의 사이에 평가판,다음과 같은 두 가지 스크립트가 예상대로 작동 evaled 다른 후 하나:

class C {{println 'hi'}}
new C()

...

new C()

그러나 방법에 구속되어 있는 클래스를 선언,그리고 GroovyShell 새로 생성 등에 대한 각각의 인스턴스입니다.당신이 필요하지 않은 경우 반환 값의 어떤 스크립트와 그들은 진정으로 스크립트(지는 클래스는 주요 방법)연결할 수 있는 다음과 같은 끝의 모든 평가 scrips.

Class klass = this.getClass()
this.getMetaClass().getMethods().each {
  if (it.declaringClass.cachedClass == klass) {
    binding[it.name] = this.&"$it.name"
  }
}

경우에 따라 값을 반환할 수 있는 손으로 관리 평가하고 실행하는 스크립트의 일부분으로 구문 분석(경고,검증되지 않은 코드는 다음에 대한 설명만을 사용합)...

String scriptText = ...
Script script = shell.parse(scriptText)
def returnValue = script.run()
Class klass = script.getClass()
script.getMetaClass().getMethods().each {
  if (it.declaringClass.cachedClass == klass) {
    shell.context[it.name] = this.&"$it.name"
  }
}
// do whatever with returnValue...

가 마지막으로 한 가지 주의할 점은 내가 알고 있어야 합니다.정적으로 입력 변수는 평가판 사이에 보관하지 않기 때문에 저장된 구속력이 있습니다.그래서 이전 스크립트가 변수'klass'보관되지 않습니다 사이의 스크립트를 호출하고 사라질 것입니다.를 해결하는 단순히 제거하는 유형을 선언에서 첫 번째 사용의 모든 변수,즉 그들을 읽고 쓰여 구속력이 있습니다.

이것이 무엇을 찾고 계십니까?

그루비에서 활동

def binding = new Binding(x: 6, y: 4)
def shell = new GroovyShell(binding)
def expression = '''f = x * y'''
shell.evaluate(expression)
assert binding.getVariable("f") == 24

의 적절한 사용 바인딩 할 수 있도록 상태를 유지하지?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top