用Java程序自修改[关闭](Self modifying code in Java [closed

2019-06-24 06:10发布

你有没有创建或遇到了自修改代码在Java中? 如果是,那么请张贴的链接,或简单地张贴代码。

Answer 1:

(!)忽略悲伤的世界里,你可以通过自修改代码会造成自己,在我看来,有3个选项:

  1. 使用内置的编译器支持Java 6和写入/编译/重载类
  2. 使用Apache BCEL字节码操作库直接写入你的类
  3. 利用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]