2017-04-03 1 views
1

다른 Groovy 스크립트의 클로저를 저장할 수 있습니까?다른 스크립트의 클로저를 Groovy 전역 저장

package com.test 

class ClosureContainer { 
    static closures = [:] 

    static def AddClosure(String name, Closure cl) { 
     println "Adding closure named ${name}" 
     closures[name] = cl 
    } 
} 

그리고 나는 그것을 폐쇄를 추가 그루비 스크립트 싶은 :

import com.test.ClosureContainer as container 

container.AddClosure("Interesting stuff", { 
    println "I'm doing some interesting stuff" 
}) 

을 그리고 나중에, 내가해야을 의 내가 클로저를 저장해야 클래스의 일종 있다고 가정 해 봅시다 다음과 같이 부를 수 있습니다 :

def closureCode = ClosureContainer.closures["Interesting stuff"] 
closureCode() 

Groovy에서 가장 좋은 방법은 무엇입니까? 이 스크립트에서 클래스가 생성되므로 스크립트를 호출하는 방법을 잘 모르겠습니다. 런타임 중에 스크립트의 인스턴스를 만들 수 있지만이를 하드 코딩하지 않고 클래스/스크립트 목록을 검색 할 수는 없습니다.

UPDATE :

하는의 내가 컨테이너에 몇 클로저를 추가 패키지 com.test.scripts에 testScript.groovy이 있다고 가정하자.

def className = Class.forName("com.test.scripts.testScript") 
def instance = className.newInstance() 
instance.run() 

그리고 나는 testScript 이름을 하드 코딩 해요 : 나는 Gradle을이 스크립트에서 클래스를 생성하고이 같은 코드의 인스턴스를 만들 수 있도록 노력했다. 하지만 많은 스크립트가있을 것이고 동적으로 검색 할 수 있어야합니다.

+0

하드 코딩이란 무엇입니까? 코드의 어느 부분이 하드 코딩 되었습니까? – dsharew

+0

질문을 업데이트했습니다. – Jaryn6909

+0

오, 이제 GroovyScriptEngine을 사용해야하는 경우를 이해합니다. – dsharew

답변

0

그루비 스크립트를 실행하기 위해 권장되는 방법은 GroovyScriptEngine을 사용하는 것입니다

String[] path = new String[] { "." }; 
GroovyScriptEngine engine = new GroovyScriptEngine(path); 
engine.run("yoursriptname.groovy", new Binding()) 

NB : yoursriptnamepath에 스크립트의 상대 경로 여야합니다.

바인딩 (인수와 결과를 얻으려면)을 전달하려면 Binding을 사용해야합니다.

+0

여러 스크립트를 실행하는 동안 클로저를 전역 적으로 저장하는 문제가 해결 되었습니까? – pczeus

+0

나는 그걸로 일할 수 있다고 생각하는데, 응답에 많은 감사를드립니다. – Jaryn6909

+0

NP. 천만에요 – dsharew

관련 문제