如何从 Java 5 和 Java 6 中的任意字符串(在内存中)编译 java 代码,加载它并在其上运行特定方法(预定义)?
在你发火之前,我查看了现有的实现:
- 大多数依赖于 Java 6 Compiler API。
- 那些没有,依靠技巧。
- 是的,我查看了 commons-jci。要么我太密集而无法理解它是如何工作的,要么就是没有。
- 我找不到如何为编译器提供我当前的类路径(这是相当大的)。
- 在有效的实现上(在 Java 6 中),我找不到如何正确加载内部类(或内部匿名类)。
- 如果整个东西都在内存中,我会非常喜欢它,因为它可以在多个环境中运行。
我确信这已经解决了,但是我在谷歌上找不到任何看起来甚至是半生产质量的东西(除了 jci,正如我之前所说,我还没有设法使用)。
编辑:
- 我查看了 JavaAssist - 我需要内部类、Java 5.0 语言级别支持以及使用整个类路径进行编译。另外,我想即时创建新课程。我可能弄错了,但我找不到如何使用 JavaAssit 执行此操作。
- 我愿意使用基于文件系统的解决方案(调用 javac),但我不知道如何预测类路径,也不知道以后如何使用特殊的类加载器加载文件(不在我的类路径中)为多次调用而回收。虽然我确实知道如何研究它,但我更喜欢现成的解决方案。
Edit2:目前,我对 BeanShell“评估”感到满意。显然它做了我需要它做的一切(获取一个字符串,在“当前”类路径的上下文中评估它。它确实错过了一些 Java 5 功能,但它可以使用枚举(未定义)和编译的“通用”(删除) 类,所以对于我想要的应该足够了。
我不想将答案标记为已接受,因为我确实希望出现更好的解决方案。
Edit3:接受了 beanshell 的建议——它真的很有效。