访问由 groovy 编译定制程序生成的 class

Access class generated by groovy compilation customizer

我想要一个包含一些代码的 groovy 脚本,然后我想将该代码复制到生成的 class 中的一个方法中。然后在 运行 时使用那个 class。

当我 运行 下面的代码时,我得到 ClassNotFoundException。我该如何修复它,以便我可以创建这个生成的对象 class?

class GenerateClassTest {

    public static void main(String[] args) {
        String script = ''
        CompilerConfiguration compilerConfiguration = new CompilerConfiguration()
        compilerConfiguration.addCompilationCustomizers(new MyCompilationCustomizer())
        GroovyClassLoader myClassLoader = new GroovyClassLoader()
        GroovyShell groovyShell = new GroovyShell(myClassLoader, new Binding(), compilerConfiguration)
        groovyShell.evaluate(script)
        def newGeneratedClassObj = myClassLoader.loadClass('MyGeneratedClass').newInstance()
    }
}

class MyCompilationCustomizer extends CompilationCustomizer {

    MyCompilationCustomizer() {
        super(CompilePhase.CONVERSION)
    }

    @Override
    void call(SourceUnit source, GeneratorContext context, ClassNode currentClassNode) throws CompilationFailedException {

        ClassNode myNewClass = new AstBuilder().buildFromSpec {
            classNode('MyGeneratedClass', ClassNode.ACC_PUBLIC) {
                classNode Object
                interfaces {}
                mixins {}
            }
        }.first()
        source.getAST().addClass(myNewClass)
    }
}

而不是

def newGeneratedClassObj = myClassLoader.loadClass('MyGeneratedClass').newInstance()

使用评估脚本的GroovyShell

def newGeneratedClassObj = groovyShell.getClassLoader().loadClass('MyGeneratedClass').newInstance()