9

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

4

7 回答 7

9

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

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

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

于 2009-06-26T11:09:35.103 回答
2

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

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

于 2009-06-26T11:05:16.017 回答
1

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

于 2009-06-26T10:59:46.293 回答
1

BCEL

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

于 2009-06-26T11:03:11.760 回答
1

为此,我看到了这些选项:

  • 生成java源代码,用外部javac或者内部编译工具编译(记不住名字)。由于您负责命名,因此只需在类名中包含版本计数以避免类加载异常。
  • 使用内置的 JavaScript 引擎支持
  • 使用java Proxys可以解决一些场景

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

于 2009-06-26T11:05:00.633 回答
0

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

于 2009-06-26T11:07:26.323 回答
-2

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

于 2009-06-26T11:00:47.333 回答