3

有没有办法使用外部存储的源代码并将其加载到 Java 程序中,以便它可以使用它?

我想要一个无需编辑完整源代码即可更改的程序,甚至无需每次都编译。另一个优点是,我可以随意更改部分代码。

当然,我必须有接口,以便可以将数据发送到其中并再次将其返回到固定源程序中。

当然,它应该比纯口译系统更快。

那么有没有办法做到这一点,比如额外编译这些外部源代码部分并在完成后启动程序?

提前谢谢你,安德烈亚斯 :)

4

3 回答 3

9

为此,您需要javax.tools API。因此,您至少需要安装 JDK 才能使其工作(并让您的 IDE 指向它而不是 JRE)。这是一个基本的启动示例(没有适当的异常和编码处理,只是为了使基本示例不那么不透明,咳嗽):

public static void main(String... args) throws Exception {
    String source = "public class Test { static { System.out.println(\"test\"); } }";

    File root = new File("/test");
    File sourceFile = new File(root, "Test.java");
    Writer writer = new FileWriter(sourceFile);
    writer.write(source);
    writer.close();

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    compiler.run(null, null, null, sourceFile.getPath());

    URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
    Class<?> cls = Class.forName("Test", true, classLoader);
}

这应该打印test在标准输出中,正如测试源代码中的静态初始化程序所做的那样。如果这些类实现了已经在类路径中的某个接口,则进一步使用会更容易。否则,您需要使用反射 API来访问和调用方法/字段。

于 2009-12-30T19:18:12.183 回答
1

在 Java 6 或更高版本中,您可以通过 javax.tools 包访问编译器。ToolProvider.getSystemJavaCompiler() 将为您提供javax.tools.JavaCompiler,您可以对其进行配置以编译您的源代码。如果您使用的是早期版本的 Java,您仍然可以通过内部的 com.sun.tools.javac.Main 接口来使用它,尽管它的灵活性要低得多。

于 2009-12-30T19:15:26.370 回答
0

Java6 有一个脚本 API。我已经将它与 Javascript 一起使用,但我相信您也可以让它编译外部 Java 代码。

http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/

编辑:这是一个更相关的链接: Java应用程序中的“动态源”代码

于 2009-12-30T18:50:55.260 回答