gpt4 book ai didi

没有外部库的 Java 字节码操作

转载 作者:行者123 更新时间:2023-12-05 03:04:45 28 4
gpt4 key购买 nike

ASM、BCEL、Javaassist 和 AspectJ 等库都能够进行运行时字节码操作,但它们是如何实现的呢?

我以前使用 ASM 做过一些基本的字节码操作,但我不明白它是如何工作的。 Java Agent 是否在程序的其余部分之前在 JVM 中执行,从而允许 ASM 加载已编译的类并在它们被 JVM 执行之前编辑它们?

如果是这样,是否可以在不使用外部库(如 ASM)和使用 BufferedReader 加载已编译的类文件以及编写自定义解析器等的情况下执行 java 字节码操作?

最佳答案

这些库基于标准 Java API,当然,您也可以在没有这些库的情况下自行使用。

首先,Java 类文件只是格式明确的字节序列,如JVMS §4, The class File Format 中所指定。 .上述库的主要任务是提供用于处理这种格式的字节序列的工具。第二个是关于获取现有或导出修改后或新建类的定义。

有两种不同的方式处理第二个任务。一种是从持久存储(如文件系统或 jar 文件等)中读取已编译的类,并在特定代码未运行时将它们写回这些存储,就像构建和部署工具一样。这应该是微不足道的,因为它归结为读取和写入字节。

另一种是在运行时操作类,这可以由 Java 代理通过 Instrumentation API 完成。 .它提供了在首次使用之前在加载/定义时拦截类的机制,也提供了类的重新定义。后者不能随意更改,目前必须保留所有字段和方法的声明,因此主要用于更改方法的可执行代码。

如果您想要在没有额外的第 3 方库的情况下处理类文件的示例,Stackoverflow 上有一些答案

当然,这些示例只是单一用途的代码或草图。如果您将它们扩展到更通用或更有用的东西,您很快就会基本上重新实现这些库。

关于没有外部库的 Java 字节码操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52688509/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com