使用FieldNode向Groovy类添加字段
是否可以动态创建Groovy类并使用FieldNode类向其添加字段?以下是我的尝试:使用FieldNode向Groovy类添加字段,groovy,metaprogramming,abstract-syntax-tree,Groovy,Metaprogramming,Abstract Syntax Tree,是否可以动态创建Groovy类并使用FieldNode类向其添加字段?以下是我的尝试: package asttest import org.codehaus.groovy.control.* import org.codehaus.groovy.ast.* import org.codehaus.groovy.ast.stmt.* import org.codehaus.groovy.ast.expr.* GroovyClassLoader loader = new GroovyCla
package asttest
import org.codehaus.groovy.control.*
import org.codehaus.groovy.ast.*
import org.codehaus.groovy.ast.stmt.*
import org.codehaus.groovy.ast.expr.*
GroovyClassLoader loader = new GroovyClassLoader()
cls = loader.parseClass('class Position{}')
ClassNode integerClassNode = new ClassNode(Integer.class)
ClassNode classNode = new ClassNode(cls)
FieldNode xFieldNode = new FieldNode(
'x', FieldNode.ACC_PUBLIC, integerClassNode, classNode, new EmptyExpression())
FieldNode yFieldNode = new FieldNode(
'y', FieldNode.ACC_PUBLIC, integerClassNode, classNode, new EmptyExpression())
FieldNode zFieldNode = new FieldNode(
'z', FieldNode.ACC_PUBLIC, integerClassNode, classNode, new EmptyExpression())
classNode.addField(xFieldNode)
classNode.addField(yFieldNode)
classNode.addField(zFieldNode)
CompilationUnit compilationUnit = new CompilationUnit(loader)
compilationUnit.addClassNode(classNode)
compilationUnit.compile()
instance = cls.newInstance()
instance.x = 1
运行此代码时的结果是:
Caught: BUG! exception in phase 'class generation' in source unit '?' unexpected NullpointerException
BUG! exception in phase 'class generation' in source unit '?' unexpected NullpointerException
at asttest.Main.run(Main.groovy:35)
Caused by: java.lang.NullPointerException
... 1 more
我知道我可以使用元类()向类中添加字段,但使用Groovy AST类似乎更灵活