我注意到 JDK 7 中有一个编译器 API。这是否意味着 Java 程序可以重新编译和更改正在运行的程序的定义?
目前我知道像 JavaRebel 这样的产品可以做到这一点,但提供免费下载的产品不包括付费产品 Javarebel。
Java 6 中已经提供编译器 API。
我们无法更改已加载类的代码——热代码替换仍将仅限于调试,但我们可以从 Java 应用程序编译源代码并在运行时加载新创建的类。
是的,有可能。一种方法是编写专门的类加载器并使用 ASM 之类的字节码增强工具,并在运行时更改应用程序的某些部分。也可以使用 a javaagent
and againASM
或类似的东西来实现相同的目的。
据我所知,Java 7 没有引入额外的自我修改方法。
一些影响已经可以通过使用编译器 API 和 完成ClassLoaders
,而其他一些影响可以使用JVM TI完成。
但据我所知,Java 7 并未对这些 API 进行任何重大更改。
有一个项目可以向 OpenJDK 7 添加类似 JRebel 的类重新加载功能,尽管它目前不是 Open JDK 7 的一部分:Dynamic Code Evolution VM (DCEVM)
它通过正常的JVMTI类重定义机制工作。
Javeleon提供了这些方面的功能;它是免费提供的,但不能自由再分发。
Compiler API (JSR 199) 与代码重新加载或自我修改几乎没有关系,除了希望以某种方式加载新字节码的程序可能使用 199 从 Java 源构建该字节码,而不是使用汇编程序 API像 ASM。
更新:
看起来 Javelon 已不再可用,因为它已被 zeroturnaround(JRebel 的创建者)收购
从 Javelon 主页:
注意:Javeleon 将不再作为独立产品提供下载。