2013-06-03 17 views
11

私は、ユーザがGroovyでクラスを定義させ、最終的にいくつかのインタフェースを実装させることによって、拡張可能にしたいアプリケーションを持っています。実行時にJavaからGroovyクラスをコンパイルして使用しますか?

重要な点は、実行時に解釈/コンパイルする必要があることです。私。私は.groovyを取ってそれをコンパイルするために私のアプリが必要です。起動時にそれをすることはOKです。

もちろん、私のアプリはそのクラスをインスタンス化できるはずです。

私は2つのソリューションを参照してください。

1)、アプリの実行中にコンパイルし、クラスパス上のどこかのクラスを入れ、その後、ちょうど彼らが常にあったふり、クラスをロードします。

2)よりスマートな方法 - 私のシステムクラスローダに見せるためにコンパイラAPIといくつかのクラスローディング魔法を呼び出す。

オプション2)はどうすればよいですか?
他のアイデアをお持ちですか?

答えて

8

Integrating Groovy into applications

  • 取得クラスローダ
  • 負荷クラス
  • インスタンス化クラスを見てください。

美容: -
.groovy.classバイトコードにコンパイルするので、クラスを解析すると、あなたinstanceofClassを与えるでしょう。今はすべてのJAVAの世界になりますが、唯一の違いは、GroovyObjectをインスタンス化した後は、必要に応じてメソッドを呼び出すことです。

編集:ただ、それはここに含まれています:

InputStream groovyClassIS = GroovyCompiler.class 
    .getResourceAsStream("/org/jboss/loom/tools/groovy/Foo.groovy"); 

GroovyClassLoader gcl = new GroovyClassLoader(); 
Class clazz = gcl.parseClass(groovyClassIS, "SomeClassName.groovy"); 
Object obj = clazz.newInstance(); 
IFoo action = (IFoo) obj; 
System.out.println(action.foo()); 

package org.jboss.loom.migrators.mail; 

import org.jboss.loom.tools.groovy.IFoo; 

public class Foo implements IFoo { 
    public String foo(){ 
     return "Foooooooooo Action!"; 
    } 
} 
関連する問題