짧은 대답은 할 수 없습니다. 긴 대답은 :
당신의 코드를 필요에 따라, 당신은 아마도
에 설명 된대로 런타임에 클래스 경로에서 사용할 수있는 스크립트의 소스 코드가 필요합니다
// file: example1.groovy
def a = { it.twice() }
println a.metaClass.classNode.getDeclaredMethods("doCall")[0].code.text
// prints: { return it.twice() }
하지만
멀리 얻을 수 그것은 런타임
에서 사용할 경우
groovy.lang.MetaClass # getClassNode()는
는 "메타 클래스 원래 AST 참조를 취득 그것이 될 수없는 경우 수 있듯이 원래 AST 또는 null @ 반환는 정말 동일한 코드의 AST의 표현처럼 단지 코드를 반환하지 않습니다 "
및
텍스트 트릭을 반환
// file: example2.groovy
def b = {p-> p.twice() * "p"}
println b.metaClass.classNode.getDeclaredMethods("doCall")[0].code.text
// prints: { return (p.twice() * p) }
여전히이 스크립트에서 볼 수, 당신이 단지 얼핏에게
을하려는 경우 그대로 유용 할 수 있습니다 당신이 경우 당신의 손에 너무 많은 시간이 있고 꽤 그것이
OR, 지금 groovy.inspect.swingui.AstNodeToScriptVisitor
// file: example3.groovy
def c = {w->
[1,2,3].each {
println "$it"
(1..it).each {x->
println 'this seems' << ' somewhat closer' << ''' to the
original''' << " $x"
}
}
}
def node = c.metaClass.classNode.getDeclaredMethods("doCall")[0].code
def writer = new StringWriter()
node.visit new groovy.inspect.swingui.AstNodeToScriptVisitor(writer)
println writer
// prints: return [1, 2, 3].each({
// this.println("$it")
// return (1.. it).each({ java.lang.Object x ->
// return this.println('this seems' << ' somewhat closer' << ' to the \n original' << " $x")
// })
// })
같은 기존의 것을 훔치는 인쇄 org.codehaus.groovy.ast.GroovyCodeVisitor
자신을 작성할 수 있습니다 어떻게 해야할지 모르겠어요. 당신이 원래, 정확한, 실행 가능한 코드를 원하는 경우
... 당신이
이 내 말은, 당신은 소스 라인 정보를 사용할 수 운이 있습니다,하지만 난 체크 마지막으로, 정말 잘
그들을 점점되지 않았습니다
// file: example1.groovy
....
def code = a.metaClass.classNode.getDeclaredMethods("doCall")[0].code
println "$code.lineNumber $code.columnNumber $code.lastLineNumber $code.lastColumnNumber"
new File('example1.groovy').readLines()
... etc etc you get the idea.
줄 번호는 적어도 이것은 아마 당신의 상황과 일치하지 않습니다
하지만 원래의 코드 근처 shuld,하지만 당신은 다른 길을 갈 수 있습니다. GroovyShell 이후.evaluate()은 적절한 var 바인딩을 사용하여 String을 실행합니다. 클로저가 단순히 문자열 일 경우 어떻게해야합니까? –