2011-03-07 125 views
1

我想編寫一個程序來動態調用另一個Java類(未編譯)內的方法,該方法的文件名與位置是給定的。爲此,我使用了下面的代碼,但它不起作用。用於實例化另一個java文件的java代碼

//folder location of my java file to be loaded 
String url = "C:/Temp/testcases/test.java"; 
//name of the java file to be loaded 
String classname = "test.java"; 
this.class.classLoader.rootLoader.addURL(new URL(url+str)); 
Class.forName(str).newInstance(); 

上面的實例無法調用我想要動態加載的java文件內部的方法。它有什麼錯誤?

+2

您可能要編譯Java文件... – Erik 2011-03-07 11:53:02

+1

有些事情不可能沒有反映,但使用反射很多東西都只是糟糕的設計。爲什麼使用動態類加載而不是將編譯後的類文件添加到應用程序的運行時類路徑中? – 2011-03-07 12:04:41

回答

0

我同意你的答案。上述代碼中的錯誤是使用新的URL(C:// ...)。如果我正確地提到包名wrt路徑,它應該已經工作。無論如何,我正在處理groovy文件,所以我發現這個代碼比上面提到的普通的class.forname更高效。

def sourceString = (new File(C:/xyz.groovy)).getText() 
ClassLoader parent = getClass().getClassLoader(); 
GroovyClassLoader loader = new GroovyClassLoader(parent); 
Class groovyClass = loader.parseClass(sourceString); 
template = groovyClass.newInstance() 
3

類加載器只能加載編譯類。它無法打開Java源文件,在運行中編譯它們,並加載它們的類。

此外,類名與文件名不一樣。

+0

那麼你能想到任何其他方法來加載java源文件,而不是在飛行中編譯它? 如果編譯它是唯一的方法,我們如何在代碼中執行它?在我的情況下,類名和文件名是相同的。 – 2011-03-07 12:07:39

+1

這裏有一些Java 6編譯器API的例子:http://www.java2s.com/Code/Java/JDK-6/Java-Compiler-tools.htm – 2011-03-07 13:05:26