JDK 7允许程序改变自己的代码吗?

时间:2011-03-15 10:36:10

标签: java java-7

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

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

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

据我所知,Java 7没有引入其他自我修改方法。

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

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

答案 3 :(得分:3)

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

它通过正常的JVMTI类重新定义机制起作用。

答案 4 :(得分:2)

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

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

更新:

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

来自Javelon主页:

  

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