2011-03-07 121 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