有没有办法使用外部存储的源代码并将其加载到 Java 程序中,以便它可以使用它?
我想要一个无需编辑完整源代码即可更改的程序,甚至无需每次都编译。另一个优点是,我可以随意更改部分代码。
当然,我必须有接口,以便可以将数据发送到其中并再次将其返回到固定源程序中。
当然,它应该比纯口译系统更快。
那么有没有办法做到这一点,比如额外编译这些外部源代码部分并在完成后启动程序?
提前谢谢你,安德烈亚斯 :)
有没有办法使用外部存储的源代码并将其加载到 Java 程序中,以便它可以使用它?
我想要一个无需编辑完整源代码即可更改的程序,甚至无需每次都编译。另一个优点是,我可以随意更改部分代码。
当然,我必须有接口,以便可以将数据发送到其中并再次将其返回到固定源程序中。
当然,它应该比纯口译系统更快。
那么有没有办法做到这一点,比如额外编译这些外部源代码部分并在完成后启动程序?
提前谢谢你,安德烈亚斯 :)
为此,您需要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来访问和调用方法/字段。
在 Java 6 或更高版本中,您可以通过 javax.tools 包访问编译器。ToolProvider.getSystemJavaCompiler() 将为您提供javax.tools.JavaCompiler,您可以对其进行配置以编译您的源代码。如果您使用的是早期版本的 Java,您仍然可以通过内部的 com.sun.tools.javac.Main 接口来使用它,尽管它的灵活性要低得多。
Java6 有一个脚本 API。我已经将它与 Javascript 一起使用,但我相信您也可以让它编译外部 Java 代码。
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/
编辑:这是一个更相关的链接: Java应用程序中的“动态源”代码