你有没有创建或遇到了自修改代码在Java中? 如果是,那么请张贴的链接,或简单地张贴代码。
Answer 1:
(!)忽略悲伤的世界里,你可以通过自修改代码会造成自己,在我看来,有3个选项:
- 使用内置的编译器支持Java 6和写入/编译/重载类
- 使用Apache BCEL字节码操作库直接写入你的类
- 利用Java 6中的内置脚本支持(或使用Apache BSF )写在你选择的JVM的脚本语言的方法,并执行这些
上述三个的,我最初的选择(没有需求)将是看看选项3.我怀疑这是启动至少痛苦的方式。 我用所有上述的 - 不幸的是,我不能发布链接到客户端代码。
Answer 2:
这应该是难以实现。 但你可以在运行时新的类,并创建一个定制的ClassLoader加载它们。 如果您想再次修改代码,你需要重新加载的类。
Answer 3:
从BCEL :
字节码工程库的目的是给用户提供了方便的可能性来分析,创建和操纵(二进制)Java类文件(那些具有的.class结尾)。 方法,字段和字节代码指令,特别是:类由包含给定类的所有符号信息对象表示。
Answer 4:
您可以编写使用就像一个图书馆产生在运行时新的类(字节码)(Java)的代码BCEL 。 这不是完全一样自修改代码。 我怀疑自修改代码是不是在JVM支持。
在运行时生成新的代码的一个例子,看看的源代码的Clojure 。
Answer 5:
我看到这些选项用于此目的:
- 生成Java源代码,并与外部的javac或内部编译工具(不记得名字)编译。 而当你负责的命名,只是包括类名称的版本数,以避免类加载异常。
- 使用内置的JavaScript引擎支持
- 某些情况下可以使用Java Proxys来解决
编辑 :我曾经()从他们创建的Java 1.4程序,它把业务规则从现有的传统数据库,生成的Java文件(一个谓语接口的基本实现)与一群的println和使用的命令行的javac编译它们。
Answer 6:
作为一名大学生我对工作JikesRVM 。 它是用Java实现(主要是)一个JVM。 在运行时,它会JIT编译本身! 这是一个非常酷的一项技术。
Answer 7:
你总是可以只使用一个动态语言...
文章来源: Self modifying code in Java [closed]