如何在Java 5和Java 6中从任意字符串(在内存中)编译Java代码,加载并在其上运行特定方法(预定义)?
在提出这一点之前,我研究了现有的实现:
我敢肯定,这已经解决了,但我在Google上找不到任何看起来甚至达到半成品质量的东西(jci除外,正如我之前所说,我还没有设法使用过)。
编辑:
Edit2:现在,我对BeanShell“评估”感到满意。显然,它完成了我需要做的所有事情(获取字符串,在“当前”类路径的上下文中对其进行评估。它确实缺少Java
5的某些功能,但可以使用枚举(未定义)并编译为“泛型”(已擦除) )类,因此对于我想要的内容应该足够了。
我不想将答案标记为已接受,因为我希望提出更好的解决方案。
Edit3:接受了beanshell的建议-它的确很棒。
如果您不完全依赖于编译,那么很容易嵌入Beanshell,groovy和其他脚本语言之类的解决方案(实际上,java内置了对脚本语言的支持,因此您的代码甚至不知道哪种语言脚本被写入)
Beanshell应该可以运行任何100%的Java代码IIRC,而且我相信Groovy可以运行大多数Java代码-可能全部。
问题内容: 我知道在此之前已经问过很多类似的问题,但是我认为这个问题有些不同:) 我正在编写一个maven报告插件,它将向用户列表发送电子邮件。我现在遇到的问题是,当我使用java5运行该代码时,该代码似乎运行良好,但使用java6失败。实际上,该插件是用Groovy编写的,并使用commons-email实用程序发送html消息: 该项目依赖于javax.mail:mail:1.4.1和java
问题内容: 假设我有一个静态的复杂对象,该对象由线程池定期更新,并在长时间运行的线程中或多或少地连续读取。对象本身始终是不可变的,并反映事物的最新状态。 我至少不在乎读者是看到旧版本还是新版本的Foo,但是我需要看到一个完全初始化的对象。IIUC,Java规范说,这里没有内存障碍,我可能会看到一个对象,其中fb已初始化,但fa尚未提交给内存。我的程序是一个现实世界的程序,迟早会将内容提交到内存中,
从这里可以清楚地看到,在Java中组成
我想在将源代码传递给编译器之前,在编译时转换java源代码。换句话说,我想创建一个能够转换的预处理器 转换为任何其他代码,如: null 我很乐意为这两种方法找到一个java代码预处理的简单示例。 有没有人认为有什么聪明的方法来进行代码转换,而不是用多个ivy模块完全改变现有的大型代码库?注释似乎是最好的方法,但我不明白该怎么做。
我正在为一个操作系统分配编写内联汇编代码。我有一些关于内联汇编和gcc编译器将其转换为机器代码的问题。 null
问题内容: 我如何在运行时从字符串生成字节码(Byte []),而无需使用“ javac”进程或类似的东西?有没有像这样调用编译器的简单方法? 以后添加: 我选择接受最适合 我的 情况的解决方案。我的应用程序是一个尚处于设计草图阶段的业余项目,现在是考虑插入新技术的合适时机。另外,由于应该帮助我解决BL的人是JavaScript开发人员,因此在这种情况下,使用JavaScript解释器而不是存根编