用Java自修改代码

时间:2009-06-26 10:56:39

标签: java self-modifying

您是否曾在Java中创建或遇到过self modifying code? 如果是,请发布链接或只是发布代码。

7 个答案:

答案 0 :(得分:9)

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

  1. 使用Java 6的内置编译器支持和编写/重新编译/重新加载类
  2. 使用Apache BCEL字节码操作库直接编写您的类
  3. 利用Java 6的内置脚本支持(或使用Apache BSF)以您选择的JVM脚本语言编写方法,并执行这些
  4. 在上面三个中,我最初的选择(在没有要求的情况下)将是看看选项3.我怀疑这是最难以开始的方式。我已经使用了上述所有内容 - 遗憾的是我无法发布客户端代码的链接。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

来自BCEL

  

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:-2)

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