2012-12-10 33 views
0

我在包層次結構中有一套groovy腳本。我有一個主要腳本,我想從中調用其他腳本。例如,我有這些腳本(具有相同名稱的公共類/接口在其中):動態加載groovy類/腳本而不編譯?

package.MainScript 
package.MyInterface; 

package.utils.MyInterfaceImpl1 //implements MyInterface 
package.utils.MyInterfaceImpl2 //implements MyInterface 

有沒有辦法來調用其他一個腳本,而不在編譯時知道調用的類名?我的意思是做類似動態類加載:

class MainScript { 
    public static void main (String[] args) { 
     MyInterface instance = Class.forName("package.utils.Util1"); 
    } 
} 

回答

1

是的! Groovy是一種動態語言。你可以create class instance dynamically

package.MyInterface 
class MyInterfaceImpl1 { 
    def greet() { 
     "Hello" 
    }  
} 

package.MyInterface 
class MyInterfaceImpl2 { 
    def greet() { 
     "Hi!" 
    } 
} 

def name = 'MyInterfaceImpl1' // Choose whatever you want at runtime 
def className = Class.forName("MyInterface.$name") 
def instance = className.newInstance() 
assert instance.greet() == 'Hello' 
+0

問題是,要使用Class.forName加載類,您必須將此類編譯到類路徑的某處。我需要做的是無需編譯即可加載它。當我嘗試你的建議時,我得到了ClassNotFoundException :( –

+2

也許這可以幫助:[編譯Groovy](http://groovy.codehaus.org/Compiling+Groovy)。請參閱Java應用程序中動態使用Groovy一節。 –

+0

是,就是這樣 - 請參閱Arturo的評論以回答我的問題。謝謝Arturo。 –