我编写了一些代码来编译Java源代码。然后它生成.class文件。问题是如何运行它?
例如,我对正在设置的程序和类的名称没问题,我使用了prog p = new prog(),但是,在编译它之前,类文件尚不存在。不太确定该怎么做。有人可以给我一个建议吗?
顺便说一句,这个课程看起来像这样:public void compile{
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
}
public void run(){
Prog prog = new Prog();
prog.run();
}
答案 0 :(得分:5)
如果您只想运行它,可以使用启动java进程 Runtime.exec或ProcessBuilder。这些将创建一个单独的java进程来运行您的java程序。这更有可能是你想要的。你基本上可以做的是:
>java someClass
来自您的应用程序。 This link可能有帮助。
如果你想实际加载类文件并在当前应用程序中使用它,我认为this或者动态加载Java类应该有所帮助。基本上(直接来自链接,略有修改):
public class MainClass {
public static void main(String[] args){
ClassLoader classLoader = MainClass.class.getClassLoader();
try {
Class aClass = classLoader.loadClass("MyClass");
System.out.println("aClass.getName() = " + aClass.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
加载课程后,您有一个Class对象,您可以通过调用aClass
来创建由aClass.newInstance()
表示的类的实例,这就像
MyClass newObj = new MyClass()
或者您可以使用Class
对象公开的任何其他方法。
正如davmac所指出的,上面的代码示例假定您正在加载的代码位于应用程序类路径中。如果您要运行的类文件不在类路径中,您可能需要查看URLClassLoader
答案 1 :(得分:3)
按URLClassLoader
加载。
File root = new File("/java"); // The package root.
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
Class<?> cls = Class.forName("test.Test", true, classLoader); // Assuming package test and class Test.
Object instance = cls.newInstance();
// ...
答案 2 :(得分:1)
你需要创建一个类加载器(URLClassLoader
可能会好),它将加载刚刚编译的类文件。 (因此,对于URLClassLoader
,编译输出路径应该是其中一个URL。
然后,使用类加载器加载编译的类,并使用反射执行它。
Class c = cl.loadClass("ClassName");
......等等。