我注意到JDK 7中的编译器API。这是否意味着Java程序可以重新编译并更改正在运行的程序的定义?
目前我知道像JavaRebel这样的产品可以做到这一点,但提供免费下载的产品不包括Javarebel,这是一种付费的产品。
答案 0 :(得分:8)
编译器API已在Java 6中提供。
我们无法更改已加载的类的代码 - 热代码替换仍将仅限于调试,但我们可以从Java应用程序编译源代码并在运行时加载新创建的类。
答案 1 :(得分:3)
是的,有可能。一种方法是编写专门的类加载器并使用像ASM这样的字节码增强工具,并在运行时更改应用程序的某些部分。使用javaagent
和ASM
或类似的东西也可以实现相同的效果。
答案 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将不再作为独立产品下载。