加载外部源代码并在内部使用它们(通过重新编译或其他东西)

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

我希望有一个程序可以在不编辑完整源代码的情况下进行更改,甚至可以在不编译每次的情况下进行更改。 另一个优点是,我可以像我想要的那样更改部分代码。

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

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

那么有没有一种方法可以像这样外部源代码部分的额外编译和程序的启动完成后呢?

提前谢谢你,Andreas 🙂

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

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); } 

这应该在stdout中打印test ,这由测试源代码中的静态初始化程序完成。 如果这些类实现了已经在类路径中的某个接口,那么进一步使用会更容易。 否则,您需要使用Reflection 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应用程序中的“动态源代码”