Java中的自修改代码

您是否曾在Java中创建或遇到过自修改代码 ? 如果是,那么请发布链接或只是发布代码。

忽略悲伤的世界,你可能通过自我修改代码(!)引起自己,在我看来有3个选项:

  1. 使用Java 6的内置编译器支持和write / recompile / reload类
  2. 使用Apache BCEL字节码操作库直接编写您的类
  3. 利用Java 6的内置脚本支持(或使用Apache BSF )以您选择的JVM脚本语言编写方法,并执行这些

在上面三个中,我最初的选择(在没有要求的情况下)将是看看选项3.我怀疑这是最难以开始的方式。 我已经使用了以上所有 – 不幸的是我无法发布到客户端代码的链接。

这应该很难实现。 但是您可以在运行时创建新类并使用自定义类加载器加载它们。 如果要再次修改代码,则必须重新加载该类。

来自BCEL :

字节代码工程库旨在为用户提供分析,创建和操作(二进制)Java类文件(以.class结尾的文件)的便捷方式。 类由包含给定类的所有符号信息的对象表示:特别是方法,字段和字节代码指令。

您可以编写(Java)代码,在运行时使用像bcel这样的库生成新类(字节代码)。 这与自修改代码并不完全相同。 我怀疑自修改代码不是JVM支持的。

有关在运行时生成新代码的示例,请查看clojure的源代码。

我为此目的看到了这些选项:

  • 生成java源代码并使用外部javac或内部编译器工具(无法记住名称)对其进行编译。 由于您负责命名,因此只需在类名中包含版本计数,以避免类加载exception。
  • 使用内置的JavaScript引擎支持
  • 有些场景可以使用java Proxys解决

编辑 :我曾经创建了一个Java 1.4程序,该程序从现有的遗留数据库中获取业务规则,生成java文件(基本上是Predicate接口的实现),其中包含一堆println(),并使用命令行javac编译它们。

作为一名本科生,我开始研究JikesRVM 。 它是一个用Java实现的(大部分)JVM。 在运行时它将JIT编译自己! 这是一项非常酷的技术。

你总是可以使用动态语言……