2016-04-18 17 views
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) 
    } 
} 
+0

まず、あなたが作成しているコンパイラの設定を利用していないので、カスタマイザーはなります決して呼ばれることはありません。次に、クラスローダーをGroovyShellに提供し、生成されたクラスをそこから取得する必要があります。 – melix

+0

これに 'GroovyClassLoader'を与え、それに読み込む必要があります。 – melix

+0

GroovyClassLoaderを使用していますが、同じ例外があります – mike27

答えて

1

代わりの

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

スクリプトを評価したGroovyShellを使用します。

def newGeneratedClassObj = groovyShell.getClassLoader().loadClass('MyGeneratedClass').newInstance() 
関連する問題