加载外部源代码,并在内部使用它们(通过重新编译或东西)
-
22-09-2019 - |
题
是否有使用外部存储源代码,并将其加载到一个Java PROGRAMM的方式,使得它可以通过将其可使用?
我想有,可以在不修改的完整源代码来改变的程序和,这是可能的,即使没有这种每次编译。另一个优点是,我可以改变代码的部分,如我想要的。
当然,我必须有接口,以便能够将数据发送到这一点,并再次得到它放回固定源程序。
和它当然应该是比纯解释系统更快。
那么,有在这样做了后这样做这样的外部源代码部分的额外的编译和PROGRAMM的开始的方法吗?
感谢您提前,安德烈亚斯:)
解决方案
您需要 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 /桌面/脚本/
编辑:这是更相关的链接: “动态源” 在Java应用程序代码