On-the-fly, in-memory java code compilation for Java 5 and Java 6(Java 5 和 Java 6 的动态内存中 Java 代码编译)
问题描述
如何从 Java 5 和 Java 6 中的任意字符串(内存中)编译 Java 代码,加载它并在其上运行特定方法(预定义)?
How can I compile java code from an arbitrary string (in memory) in Java 5 and Java 6, load it and run a specific method on it (predefined)?
在你发火之前,我查看了现有的实现:
Before you flame this, I looked over existing implementations:
- 大部分依赖于 Java 6 Compiler API.
- 那些不这样做的人,依靠技巧.
- 是的,我查看了 commons-jci.要么我太密集而无法理解它是如何工作的,要么就是没有.
- 我找不到如何为编译器提供我当前的类路径(非常大).
- 在有效的实现上(在 Java 6 中),我找不到如何正确加载内部类(或内部匿名类).
- 如果整个东西都在内存中,我会非常喜欢它,因为它可以在多个环境中运行.
我确信这个问题之前已经解决了,但是我在谷歌上找不到任何看起来甚至是半生产质量的东西(除了 jci,正如我之前所说,我还没有设法使用).
I'm sure this has been solved before, but I can't find anything that looks even half-production quality on google (except jci, which, as I've said before, I haven't managed to use).
- 我查看了 JavaAssist - 我需要内部类、Java 5.0 语言级别支持以及使用整个类路径进行编译.另外,我想即时创建新课程.一世可能是错误的,但我找不到如何使用 JavaAssit 执行此操作.
- 我愿意使用基于文件系统的解决方案(调用 javac),但我不知道如何判断类路径,也不知道以后如何使用特殊的类加载器加载文件(不在我的类路径中)可以为多次调用而回收.虽然我知道如何研究它,但我更喜欢现成的解决方案.
目前,我对 BeanShell 的评估"感到满意.显然它做了我需要它做的一切(获取一个字符串,在当前"类路径的上下文中评估它.它确实错过了一些 Java 5 功能,但它可以使用枚举(未定义)和编译的通用"(删除) 类,所以对于我想要的应该足够了.
For now, I'm content with BeanShell "evaluate". Apparently it does everything I need it to (get a string, evaluate it in the context of the 'current' classpath. It does miss some of Java 5 features, but it can use enums (not define) and compiled 'generic' (erased) classes, so it should be enough for what I want.
我不想将答案标记为已接受,因为我确实希望出现更好的解决方案.
Edit3:接受了 beanshell 的建议 - 它真的很有效.
Accepted the beanshell suggestion - it really works wonderfully.
推荐答案
如果你不完全依赖于编译,像 Beanshell、groovy 和其他脚本语言这样的解决方案很容易嵌入(事实上,java 已经内置支持插入脚本语言,因此您的代码甚至不知道脚本是用什么语言编写的)
If you're not completely tied to compiling, solutions like Beanshell, groovy and the other scripting languages are easily embedded (in-fact, java has built-in support for plugging in a scripting language so your code doesn't even know what language the script is written in)
Beanshell 应该运行任何 100% java 代码 IIRC,我相信 Groovy 可以运行大多数 java 代码——可能全部.
Beanshell should run any 100% java code IIRC, and I believe Groovy can run most java code--possibly all.
这篇关于Java 5 和 Java 6 的动态内存中 Java 代码编译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java 5 和 Java 6 的动态内存中 Java 代码编译
基础教程推荐
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- 降序排序:Java Map 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01