Java JDK 7是否允许程序修改自己的代码?

Java JDK 7是否允许程序修改自己的代码?,java,java-7,Java,Java 7,我注意到JDK 7中有一个编译器API。这是否意味着Java程序可以重新编译和更改正在运行的程序的定义 目前我知道像JavaRebel这样的产品可以做到这一点,但提供免费下载的产品不包括JavaRebel,因为JavaRebel是付费产品。是的,这是可能的。一种方法是编写一个专门的类加载器,使用诸如ASM之类的字节码增强工具,并在运行时更改应用程序的某些部分。使用javaagent和ASM或类似的工具也可以实现同样的效果。是的,这是可能的。一种方法是编写一个专门的类加载器,使用诸如ASM之类的字

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


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

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

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

编译器API已经在Java6中提供


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

编译器API已在Java 6中提供


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

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

一些影响已经可以通过使用编译器API和类加载器来完成,而另一些影响可以通过使用来完成


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

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

一些影响已经可以通过使用编译器API和类加载器来完成,而另一些影响可以通过使用来完成


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

有一个项目将类似JRebel的类重新加载功能添加到OpenJDK 7,尽管它目前不是OpenJDK 7:DCEVM的一部分


它通过普通的类重新定义机制工作。

有一个项目将类似JRebel的类重新加载功能添加到OpenJDK 7,尽管它目前不是OpenJDK 7:DCEVM的一部分

它通过普通的类重新定义机制工作。

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

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

更新:

Javelon似乎不再可用,因为它已被JRebel的ZeroTurnound创建者收购

从Javelon主页:

注:Javelon将不再作为独立产品提供下载

提供这些方面的功能;它免费提供,但不能自由再发行

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

更新:

Javelon似乎不再可用,因为它已被JRebel的ZeroTurnound创建者收购

从Javelon主页:

注:Javelon将不再作为独立产品提供下载


.. 但这与编译器API无关。如果我错了,请纠正我。如果OP只对使用javac或编译器API生成字节码感兴趣,那么您是对的。但是,如果他的目标是在运行时动态生成字节码,那么他可以使用ASM或Javassist,同时使用javaagent或不使用javaagent。顺便说一句,编译器API是与JVM下载捆绑在一起的还是只与JDK捆绑在一起的?这就是我在web上找到的:Java编译器的实现可以在tools.jar文件中找到,该文件通常在\lib\tools.jar中找到。所以我们需要一个JDK。。。但这与编译器API无关。如果我错了,请纠正我。如果OP只对使用javac或编译器API生成字节码感兴趣,那么您是对的。但是,如果他的目标是在运行时动态生成字节码,那么他可以使用ASM或Javassist,同时使用javaagent或不使用javaagent。顺便说一句,编译器API是与JVM下载捆绑在一起的还是只与JDK捆绑在一起的?这就是我在web上找到的:Java编译器的实现可以在tools.jar文件中找到,该文件通常在\lib\tools.jar中找到。所以我们需要一个JDK,DCEVM是叛逆者的说法并不正确。不,这是两种不同的方法。JRebel是执行代码转换的代理
为了使类能够重新加载,它还映射了工作空间并与框架集成。DCEVM是一种VM级别的方法,用于在调试模式下重新定义复杂的类。所以第一个是纯Java,后一个是VM的一个补充-两个完全不同的东西,机制不同,但目标相同。DCEVM是一种VM修改,但它使用标准JVMTI接口,只是扩展了允许的类更改的种类。DCEVM与Rebel类似并不正确。不,这是两种不同的方法。JRebel是执行代码转换以实现类重新加载的代理,它还映射工作区并与框架集成。DCEVM是一种VM级别的方法,用于在调试模式下重新定义复杂的类。所以第一个是纯Java,后一个是VM的一个补充-两个完全不同的东西,机制不同,但目标相同。DCEVM是一个VM修改,但它使用标准JVMTI接口,只是扩展了允许的类更改类型。