如何在Java 5和Java 6中从任意字符串(内存中)编译Java代码,加载它并运行其中的一个特定方法(预定义)?
在抨击我之前,请注意这一点:
- 大多数依赖于Java 6编译器API。
- 那些不依赖的则依赖于一些技巧。
- 是的,我看了commons-jci。 要么我太愚钝而无法理解它的工作原理,要么它根本无法胜任。
- 我找不到如何将我的当前类路径(非常庞大)提供给编译器。
- 在一个可行的实现中(在Java 6中),我找不到如何正确加载内部类或内部匿名类。
- 如果整个过程都在内存中进行,我会很满意,因为该程序在多个环境上运行。
我相信这个问题以前已经被解决过了,但是我在谷歌上找不到任何看起来像是生产质量的东西(除了JCI之外,就像我之前说的,我没办法使用它)。
编辑:
- 我看了JavaAssist-我需要内部类、Java 5.0语言级别支持和使用整个类路径进行编译。此外,我想即时创建新类。也许我错了,但我找不到如何使用JavaAssit做到这一点。
- 我愿意使用基于文件系统的解决方案(调用javac),但是我不知道如何获得类路径,也不知道如何稍后加载文件(这些文件不在我的类路径中)并使用可以回收的特殊类加载器多次调用它们。虽然我知道如何研究它,但我更喜欢一个现成的解决方案。
编辑2:
目前,我对BeanShell的“evaluate”功能感到满意。 显然,它可以满足我所有的需求(获取一个字符串,在“当前”类路径的情况下评估它)。 它确实缺少一些Java 5功能,但它可以使用枚举类型(不能定义)和已编译的“通用”(擦除)类,因此应该足以满足我的需求。
我暂时不想把答案标记为已接受,因为我希望有更好的解决方案出现。
编辑3:接受了beanshell建议 - 它确实非常有效。