用于实例化另一个java文件的java代码

用于实例化另一个java文件的java代码,java,groovy,Java,Groovy,我想编写一个程序来动态调用另一个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.r

我想编写一个程序来动态调用另一个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文件中的方法。其中有什么错误?

类加载器只能加载已编译的类。它无法打开Java源文件,动态编译它们,并加载它们的类


此外,类名与文件名不同。

我同意你的答案。上述代码中的错误与新URL(C://…)有关。如果我正确地提到了包名wrt path,它应该可以工作。总之,我处理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()

您可能想要编译那个java文件……有些东西没有反射是不可能的,但是许多使用反射的东西都是糟糕的设计。为什么要使用动态类加载,而不是将编译后的类文件添加到应用程序的运行时类路径中?那么,您能想出其他方法来加载java源文件,而不是动态编译它吗?如果动态编译是唯一的方法,那么我们如何在代码中进行编译呢?在我的例子中,类名和文件名是相同的。这里有一些Java 6编译器API的示例: