0
いくつかのコードでグルーヴィ・スクリプトを作成し、そのコードを生成されたクラスのメソッドにコピーしたいとします。その後、実行時にそのクラスを使用します。groovyコンパイル・カスタマイザによって生成されたアクセス・クラス
以下のコードを実行すると、ClassNotFoundException
が得られます。このクラスのオブジェクトを作成できるように、どうすれば修正できますか?
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)
}
}
まず、あなたが作成しているコンパイラの設定を利用していないので、カスタマイザーはなります決して呼ばれることはありません。次に、クラスローダーをGroovyShellに提供し、生成されたクラスをそこから取得する必要があります。 – melix
これに 'GroovyClassLoader'を与え、それに読み込む必要があります。 – melix
GroovyClassLoaderを使用していますが、同じ例外があります – mike27