Java中的自修改代码

9

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


如果可能,请发布代码或链接 - Rakesh Juyal
7个回答

9
忽略自我修改代码可能会给自己带来的悲伤,对于编程相关内容,我认为有三个选择:
  1. 使用Java 6内置的编译器支持编写/重新编译/重新加载类
  2. 使用Apache BCEL字节码操作库直接编写您的类
  3. 利用Java 6内置的脚本支持(或使用Apache BSF)编写您选择的JVM脚本语言中的方法,并执行这些方法
在上述三种选择中,在没有要求的情况下,我的首选是看看第三个选项。我已经使用了以上所有选项 - 不幸的是,我不能发布客户端代码的链接。

不要使用BCEL,而要使用ObjectWeb ASM [http://asm.ow2.org/]。 - KitsuneYMG

2
您可以使用类似于bcel的库编写(Java)代码,在运行时生成新的类(字节码)。但这与自修改代码并不完全相同。我怀疑自修改代码不是JVM支持的功能。
如果您想查看在运行时生成新代码的示例,请查看clojure的源代码。

1

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


那将是一个相当不错的工厂方法! - akf

1

来自BCEL

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


我真的不明白,Jeremy。你是在当前上下文中说话吗? - Rakesh Juyal
1
BCEL 只完成了其中一部分工作:它帮助您生成或操作新类。第二件事是加载新类,这是内置于 Java 中的反射 API。 - Mnementh

1

我看到了以下几个选项:

  • 生成Java源代码并使用外部javac或内部编译器工具(记不清名字了)进行编译。由于您负责命名,只需在类名中包含版本计数以避免类加载异常。
  • 使用内置的JavaScript引擎支持
  • 一些情况可以使用Java代理来解决

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


0

本科时我有机会参与JikesRVM的开发。它是一个(大部分)用Java实现的JVM。在运行时,它会即时编译自身!这是一项非常酷的技术。


-2

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


我认为这个问题是出于无聊而发布的,所以你的回答可能不正确。 - IAdapter
2
-1 因为问题明确指出了Java - Peter Kofler
Java语言还是Java虚拟机?这两者之间有很大的区别。 - OOPMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接