1

我注意到 JDK 7 中有一个编译器 API。这是否意味着 Java 程序可以重新编译和更改正在运行的程序的定义?

目前我知道像 JavaRebel 这样的产品可以做到这一点,但提供免费下载的产品不包括付费产品 Javarebel。

4

5 回答 5

8

Java 6 中已经提供编译器 API。

我们无法更改已加载类的代码——热代码替换仍将仅限于调试,但我们可以从 Java 应用程序编译源代码并在运行时加载新创建的类。

于 2011-03-15T10:40:54.700 回答
3

是的,有可能。一种方法是编写专门的类加载器并使用 ASM 之类的字节码增强工具,并在运行时更改应用程序的某些部分。也可以使用 a javaagentand againASM或类似的东西来实现相同的目的。

于 2011-03-15T10:40:37.563 回答
3

据我所知,Java 7 没有引入额外的自我修改方法。

一些影响已经可以通过使用编译器 API 和 完成ClassLoaders,而其他一些影响可以使用JVM TI完成。

但据我所知,Java 7 并未对这些 API 进行任何重大更改。

于 2011-03-15T10:42:01.943 回答
3

有一个项目可以向 OpenJDK 7 添加类似 JRebel 的类重新加载功能,尽管它目前不是 Open JDK 7 的一部分:Dynamic Code Evolution VM (DCEVM)

它通过正常的JVMTI类重定义机制工作。

于 2011-03-19T15:58:13.570 回答
2

Javeleon提供了这些方面的功能;它是免费提供的,但不能自由再分发。

Compiler API (JSR 199) 与代码重新加载或自我修改几乎没有关系,除了希望以某种方式加载新字节码的程序可能使用 199 从 Java 源构建该字节码,而不是使用汇编程序 API像 ASM。

更新:

看起来 Javelon 已不再可用,因为它已被 zeroturnaround(JRebel 的创建者)收购

从 Javelon 主页:

注意:Javeleon 将不再作为独立产品提供下载。

于 2011-12-09T15:49:06.997 回答