【发布时间】:2014-02-27 22:44:42
【问题描述】:
(这个问题与我见过的许多问题相似,但大多数问题对我正在做的事情不够具体)
背景:
我的程序的目的是让使用我的程序的人可以轻松地制作自定义“插件”,然后编译并将它们加载到程序中以供使用(与在我的程序中实现的不完整、缓慢的解析器相比)程序)。我的程序允许用户将代码输入到预定义的类中,该类扩展了与我的程序一起打包的已编译类。他们将代码输入到文本窗格中,然后我的程序将代码复制到被覆盖的方法中。然后它将它保存为一个 .java 文件(几乎)为编译器准备好。程序以保存的 .java 文件作为输入运行 javac(java 编译器)。
我的问题是,我如何获取它以便客户端可以(使用我编译的程序)将此 java 文件(扩展我的 InterfaceExample)保存在他们计算机上的任何位置,让我的程序编译它(不说“找不到符号: InterfaceExample") 然后加载它并调用 doSomething() 方法?
我不断看到使用反射或 ClassLoader 的问答,还有一个几乎描述了如何编译它,但没有一个对我来说足够详细/我不完全理解它们。
【问题讨论】:
-
查看 JANINO。我用它在运行时从 java 源创建类。我更喜欢让它们直接编译到内存并编译到类加载器中。甚至不需要保存 .class 文件。 docs.codehaus.org/display/JANINO/Home
-
我会使用它,但是我的程序直接加载到内存中的方式可能不是用户想要的,并且编译的类需要在用户之间轻松找到和共享。不过,这对某些人来说可能是一个有用的答案。
-
酷。 Janino 也可以输出到文件,但如果这是你想要的,我推荐 JavaCompiler 根据接受的答案。
标签: java dynamic compilation load external