2013-06-03 76 views
11

我有一個應用程序,我想通過讓用戶在Groovy中定義類來實現可擴展,最終實現一些接口。在運行時從Java編譯和使用Groovy類?

關鍵的方面是它應該在運行時解釋/編譯。即我需要我的應用程序採取.groovy並編譯它。在啓動過程中這樣做是可以的。

然後,當然,我的應用程序應該能夠實例化該類。

我看到兩個解決方案:

1)編譯,而應用程序運行,把課上的某個地方的類路徑,然後只需加載類,假裝他們是永遠存在的。

2)一些更聰明的方法 - 調用編譯器API和一些類加載魔術讓我的系統類加載器看到它們。

我該怎麼做選項2)?
還有其他想法嗎?

回答

8

看一看Integrating Groovy into applications

  • 獲取類加載器
  • 負載類
  • 實例化類。

美容: -
由於.groovy編譯成字節碼.class,解析類可以給你一個instanceofClass。現在它成爲JAVA的全部世界,唯一不同的是,一旦你在instantitiatiation之後得到了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!"; 
    } 
}