如何在Java程序中运行Java源代码

5

我已经编写了一些代码来编译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();
}
3个回答

5
如果您只想运行它,可以使用Runtime.execProcessBuilder启动一个Java进程。这将创建一个单独的Java进程来运行您的Java程序。这可能是您想要的。您可以实现以下等效操作:
>java someClass

如果您想从您的应用程序内部加载类文件并使用它,我认为这个链接或者动态加载Java类可以帮助你。基本上(直接引用自链接,稍作修改):

要动态地加载Java类,您需要以下步骤:

  1. 创建一个ClassLoader对象
  2. 调用ClassLoader对象的defineClass()方法
  3. 使用返回的Class对象创建实例

如果您需要更多帮助,请参考这个链接

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.newInstance(),您可以创建由aClass表示的类的实例,这类似于MyClass newObj = new MyClass()。或者,您可以使用Class对象公开的任何其他方法。
正如davmac指出的那样,上面的代码示例假定您要加载的代码位于应用程序的类路径中。如果您想运行的类文件不在您的类路径中,您可能需要查看URLClassLoader

我能问一下吗,如何使用这个方法来运行 MyClass 中的一个方法?我有些迷失。 - gerky
非常感谢,你帮了我很大的忙。不过我还有一个问题。假设我调用一个没有参数的函数run(),我应该使用aClass.getMethod("run").invoke(null)吗? - gerky
如果 run 是一个静态函数,那么是的。如果 run 是一个实例函数(即它没有标记为 static),则您需要首先传递 MyClass 的一个实例给 invoke,例如:aClass.getMethod("run").invoke(aClass.newInstance()) - Zach L
非常感谢!问题已解决。你是个天才 Zach。从这里真的学到了很多,我自己还有很长的路要走。 - gerky
@user536770 哎呀,我不太清楚那个。只要继续练习、学习和尝试,你很快就会成长的 :-). - Zach L
显示剩余4条评论

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();
// ...

另请参阅:


1
你需要创建一个类加载器(使用 URLClassLoader 应该就可以了),它将会加载刚编译好的类文件。(所以对于 URLClassLoader,编译输出路径应该是其中一个 URL)。
然后,使用类加载器加载已编译的类,并使用反射执行它。 Class c = cl.loadClass("ClassName"); ...等等。

我该如何使用反射来执行它? - gerky
请查看 java.lang.Class 的 API 文档: http://download.oracle.com/javase/6/docs/api/java/lang/Class.html - davmac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接