当前位置: 首页 > 面试题库 >

Java 5和Java 6的即时内存Java代码编译

傅志文
2023-03-14
问题内容

如何在Java 5和Java 6中从任意字符串(在内存中)编译Java代码,加载并在其上运行特定方法(预定义)?

在提出这一点之前,我研究了现有的实现:

  • 大多数依赖于Java 6 Compiler API。
  • 那些没有的,依靠技巧。
  • 是的,我检查了commons-jci。我要么太笨拙,要么不明白它是如何工作的,要么就是它不起作用。
  • 我找不到如何向编译器提供当前的类路径(这是非常大的)。
  • 在有效的实现中(在Java 6中),我找不到如何正确加载内部类(或内部匿名类)的方法。
  • 如果整个东西都在内存中,我会很喜欢它,因为它可以在多个环境中运行。

我敢肯定,这已经解决了,但我在Google上找不到任何看起来甚至达到半成品质量的东西(jci除外,正如我之前所说,我还没有设法使用过)。

编辑:

  • 我查看了JavaAssist-我需要内部类,Java 5.0语言级别的支持以及整个类路径的编译。另外,我想即时创建新的类。我可能会弄错,但是我找不到使用JavaAssit进行操作的方法。
  • 我愿意使用基于文件系统的解决方案(称为javac),但我不知道如何识别类路径,也不知道以后如何使用特殊的类加载器加载文件(不在我的类路径中)为多次调用而回收。虽然我确实知道如何研究它,但我还是希望有一个现成的解决方案。

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解释器而不是存根编