câu trả lời ngắn gọn là bạn không thể. câu trả lời dài là:
tùy thuộc vào những gì bạn cần mã kiếm, bạn có lẽ có thể nhận được ngay với
// file: example1.groovy
def a = { it.twice() }
println a.metaClass.classNode.getDeclaredMethods("doCall")[0].code.text
// prints: { return it.twice() }
NHƯNG
bạn sẽ cần mã nguồn của kịch bản có sẵn trong classpath AT RUNTIME như được giải thích trong
groovy.lang.MetaClass # getClassNode()
"có được một tham chiếu đến AST ban đầu cho metaclass nếu nó là sẵn tại thời gian chạy
@return Các AST gốc hoặc null nếu nó không thể là trả lại"
VÀ
các văn bản lừa không thực sự quay trở lại cùng mã, chỉ cần một mã như đại diện của AST, như có thể thấy trong kịch bản này
// file: example2.groovy
def b = {p-> p.twice() * "p"}
println b.metaClass.classNode.getDeclaredMethods("doCall")[0].code.text
// prints: { return (p.twice() * p) }
vẫn còn, nó có thể là hữu ích vì nó là nếu bạn chỉ muốn có một cái nhìn nhanh chóng
AND, nếu bạn có quá nhiều thời gian trên tay của bạn và không biết phải làm gì bạn có thể viết riêng bạn org.codehaus.groovy.ast.GroovyCodeVisitor
đến khá in nó
OR, chỉ ăn cắp là một hiện như 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")
// })
// })
bây giờ.
nếu bạn muốn gốc, chính xác, mã Runnable ... bạn đang trên may mắn
tôi có nghĩa là, bạn có thể sử dụng thông tin dòng nguồn, nhưng thời gian qua tôi đã kiểm tra, nó đã không thực sự nhận được chúng ngay
// 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.
số dòng shuld có ít nhất gần mã gốc mặc dù
này có thể sẽ không phù hợp với hoàn cảnh của bạn, nhưng bạn có thể có thể đi theo con đường khác. Kể từ GroovyShell.assessment() thực hiện một String (với các ràng buộc var thích hợp), nếu việc đóng cửa chỉ đơn giản là một chuỗi? –