Jvm 如何获取初始类文件字节

Jvm 如何获取初始类文件字节,jvm,bytecode,instrumentation,openjdk,jvmti,Jvm,Bytecode,Instrumentation,Openjdk,Jvmti,在我的程序中,我需要初始类文件字节(在应用任何转换之前描述类的字节)。到目前为止,我评估的方法有: 使用相应的类加载器获取资源,然后只需再次加载字节数组。但这对于动态生成的类(ASM、代理等)不起作用 在ClassFileTransformer中存储对初始类文件字节的引用。虽然这样做有效,但这意味着我需要主动存储所有类的所有字节数组,以防以后需要其中一些。不酷 与上述基本相同,但使用JVMTIs ClassFileLoadHook。但问题与ClassFileTransformer相同 我检查了

在我的程序中,我需要初始类文件字节(在应用任何转换之前描述类的字节)。到目前为止,我评估的方法有:

  • 使用相应的类加载器获取资源,然后只需再次加载字节数组。但这对于动态生成的类(ASM、代理等)不起作用

  • 在ClassFileTransformer中存储对初始类文件字节的引用。虽然这样做有效,但这意味着我需要主动存储所有类的所有字节数组,以防以后需要其中一些。不酷

  • 与上述基本相同,但使用JVMTIs ClassFileLoadHook。但问题与ClassFileTransformer相同

  • 我检查了调用Instrumentation.retransformClasses时发生的情况。最后,这归结为一个本机方法,它需要instanceKlassHandles来获取类文件字节。因此,我也无法真正访问(至少我不知道如何访问)


关于如何在不预先存储所有类的字节引用的情况下获取初始类文件字节,还有其他想法吗?

只是想知道-为什么需要这个?也许您可以重新制定需求并找到另一种解决方案?正如您自己所说的,
ClassLoader
方法可能会对生成的类失败,而所有其他方法基本相同。它们都受到这样一个事实的困扰,即无法保证您的代理是列表中的第一个,而且,不必为所有类都支持插装,因此您回到了起点。在重传的情况下,你不会得到确切的初始字节,只有等效的字节码…@Holger我想我可以保证的顺序,因为我可以控制应用程序的启动方式。但即使我的转换器是列表中的第一个,这也意味着我需要保留一个所有类文件字节的副本,这将消耗内存。至于重传,等效字节码就足够了。“除了我已经尝试过的以外,还有什么其他想法吗?”拉桑很遗憾,我不能在这里详细介绍这个项目。我只能说,需要原始的、未转换的类字节。我希望这个问题表明我在提问之前已经做了一些研究。知道为什么会被否决吗?对于Java代理来说,和的组合应该足以获得所有类的(等效)字节码。如上所述,并不能保证所有类都是可转换的,但在HotSpot中,它们是可转换的。