你有没有在Java中创建或遇到self modifying code?如果是,那么请发布链接或只是发布代码 .
这应该很难实现 . 但是您可以在运行时创建新类并使用自定义类加载器加载它们 . 如果要再次修改代码,则必须重新加载该类 .
来自BCEL:
字节代码工程库旨在为用户提供分析,创建和操作(二进制)Java类文件(以.class结尾的文件)的便捷方式 . 类由包含给定类的所有符号信息的对象表示:特别是方法,字段和字节代码指令 .
您可以编写(Java)代码,在运行时使用像bcel这样的库生成新类(字节代码) . 这与自修改代码并不完全相同 . 我怀疑自修改代码不是JVM支持的东西 .
有关在运行时生成新代码的示例,请查看clojure的源代码 .
忽略悲伤的世界,你可能通过自我修改代码(!)引起自己,在我看来有3个选项:
使用Java 6的内置编译器支持和write / recompile / reload类
使用Apache BCEL字节码操作库直接编写您的类
利用Java 6的内置脚本支持(或使用Apache BSF)以您选择的JVM脚本语言编写方法,并执行这些
在上面三个中,我最初的选择(在没有要求的情况下)将是看看选项3.我怀疑这是最难以开始的方式 . 我已经使用了以上所有 - 不幸的是我无法发布到客户端代码的链接 .
我为此目的看到了这些选项:
生成java源代码并使用外部javac或内部编译器工具进行编译(不记得名称) . 由于您负责命名,因此只需在类名中包含版本计数,以避免类加载异常 .
使用内置的JavaScript引擎支持
使用Java Proxys可以解决一些场景
Edit :我曾经创建了一个Java 1.4程序,该程序从现有的遗留数据库中获取业务规则,生成java文件(基本上是Predicate接口的实现),带有一堆println(),并使用命令行javac编译它们 .
作为一名本科生,我开始研究JikesRVM . 它是一个用Java实现的(大部分)JVM . 在运行时它将JIT编译自己!这是一项非常酷的技术 .
你总是可以使用动态语言......
7 回答
这应该很难实现 . 但是您可以在运行时创建新类并使用自定义类加载器加载它们 . 如果要再次修改代码,则必须重新加载该类 .
来自BCEL:
您可以编写(Java)代码,在运行时使用像bcel这样的库生成新类(字节代码) . 这与自修改代码并不完全相同 . 我怀疑自修改代码不是JVM支持的东西 .
有关在运行时生成新代码的示例,请查看clojure的源代码 .
忽略悲伤的世界,你可能通过自我修改代码(!)引起自己,在我看来有3个选项:
使用Java 6的内置编译器支持和write / recompile / reload类
使用Apache BCEL字节码操作库直接编写您的类
利用Java 6的内置脚本支持(或使用Apache BSF)以您选择的JVM脚本语言编写方法,并执行这些
在上面三个中,我最初的选择(在没有要求的情况下)将是看看选项3.我怀疑这是最难以开始的方式 . 我已经使用了以上所有 - 不幸的是我无法发布到客户端代码的链接 .
我为此目的看到了这些选项:
生成java源代码并使用外部javac或内部编译器工具进行编译(不记得名称) . 由于您负责命名,因此只需在类名中包含版本计数,以避免类加载异常 .
使用内置的JavaScript引擎支持
使用Java Proxys可以解决一些场景
Edit :我曾经创建了一个Java 1.4程序,该程序从现有的遗留数据库中获取业务规则,生成java文件(基本上是Predicate接口的实现),带有一堆println(),并使用命令行javac编译它们 .
作为一名本科生,我开始研究JikesRVM . 它是一个用Java实现的(大部分)JVM . 在运行时它将JIT编译自己!这是一项非常酷的技术 .
你总是可以使用动态语言......