获取groovy代码块的所有对象
时间: 2023-09-01 09:07:19 浏览: 41
获取groovy代码块的所有对象的方法有很多种,以下是其中的几种:
1. 使用 GroovyShell 运行该代码块,并获取 Binding 对象,从中获取所有变量。示例代码如下:
```
def script = '''
def a = 1
String b = "hello"
List c = [1,2,3]
'''
def binding = new Binding()
def shell = new GroovyShell(binding)
shell.evaluate(script)
def allVariables = binding.variables
println allVariables.keySet()
```
2. 使用 CompilationUnit 对象解析代码块成为 AST(Abstract Syntax Tree),从中获取所有变量。示例代码如下:
```
def script = '''
def a = 1
String b = "hello"
List c = [1,2,3]
'''
def parser = new AstBuilder()
def ast = parser.buildFromString(script)
def allVariables = []
ast.statements.each {stmt ->
if (stmt instanceof DeclarationExpression) {
stmt.leftExpression.each {left ->
if (left instanceof VariableExpression) {
allVariables << left.name
}
}
}
}
println allVariables
```
3. 使用 Antlr4 解析代码块成为语法树,从中获取所有变量。示例代码如下:
```
import org.apache.groovy.parser.antlr4.GroovyParser
import org.antlr.v4.runtime.CharStreams
import org.antlr.v4.runtime.CommonTokenStream
def script = '''
def a = 1
String b = "hello"
List c = [1,2,3]
'''
def lexer = new GroovyLexer(CharStreams.fromString(script))
def tokens = new CommonTokenStream(lexer)
def parser = new GroovyParser(tokens)
def tree = parser.compilationUnit()
def allVariables = []
for (node in tree.children[0].children) {
if (node instanceof GroovyParser.VariableModifierContext
&& node.parent instanceof GroovyParser.VariableDeclaratorsContext) {
def variableName = node.parent.children[0].text
allVariables << variableName
}
}
println allVariables
```
注意:以上三种方法都只能获取到变量名,无法获取变量的值。如果需要获取变量的值,可以在执行代码块的过程中将变量和值存储到 Map 中,并在需要时从中获取。