2012-12-10 35 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。 –