Java:在运行时从同一 JVM 中获取类的字节码

标签 java clojure persistence bytecode java-bytecode-asm

相关:Is there a way to obtain the bytecode for a class at runtime?

我正在为 Clojure 添加持久性,我终于准备好添加函数了。在 Clojure 中,函数被字节编译为具有调用方法(以及其他方法)的类。这样,功能是一流的。为了使这些持久化,我需要序列化和反序列化这些类。如何在无法访问 .class 文件的情况下获取类的字节码?

如果我弄错了,请纠正我,但使用代理需要生成一个单独的 VM,该代理连接到第一个 VM。我需要从同一个 VM 执行此操作。

仅仅使用Serializable来设置和获取Class对象是不够的。反序列化后,我需要加载该类,并且在后续的 VM 实例中,可能会发生类名冲突。我需要修改字节码以在反序列化/类加载时将类重命名为唯一的名称。

最佳答案

您可以编写自己的 ClassLoader 并破解一个在加载类时记录字节码的方案。

你需要覆盖findClass来自己找到类文件,将它加载到内存中,将数据保存在某个地方(用于以后序列化),然后调用defineClass来定义JVM 中的那个类。

关于Java:在运行时从同一 JVM 中获取类的字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4130903/

相关文章:

java - SortedMap 的 keySet() 能否始终安全地转换为 SortedSet?

java - Java 中的接口(interface)数组

java - 在Windows 7中为java和ant设置环境变量

尝试运行 clojure Web 应用程序时出现 java.lang.IllegalArgumentException

java - 在子列表上调用 size() 时出现 ConcurrentModificationException

clojure - 我可以有条件地编译 clojure/clojurescript 吗?

Clojure:懒惰 + core.logic:无限循环

database - 寻找基于磁盘的类似redis的数据库

android - 将 Ormlite 与 Android 的内容提供程序结合使用

java - Mybatis 3.0.5 插入/更新语句映射与多个输入