访问由 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()
我想要一个包含一些代码的 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()