Java 如何使用Byte Buddy更改字节码?

Java 如何使用Byte Buddy更改字节码?,java,jvm,bytecode,byte-buddy,Java,Jvm,Bytecode,Byte Buddy,我将类文件的字节码加载到字节数组中 我想更改为使用Byte Buddy进行更改,以便添加探查器inteceptor 我搜索了许多例子。但是示例是rebase(aClass),重定义(aClass)或子类(aClass)。没有人在解析字节码 代理建设者离我的想法很近。但它在代理中使用。我想在类加载器中使用它 顺便说一句:我可以使用ASM更改字节码。您可以使用ClassFileLocator与TypePool组合来创建一个类型描述,您可以提供给Byte Buddy 如果有必要,类型池将在类文件定位器

我将类文件的字节码加载到字节数组中

我想更改为使用Byte Buddy进行更改,以便添加探查器inteceptor

我搜索了许多例子。但是示例是
rebase(aClass)
重定义(aClass)
子类(aClass)
。没有人在解析字节码

代理建设者离我的想法很近。但它在代理中使用。我想在
类加载器中使用它


顺便说一句:我可以使用ASM更改字节码。

您可以使用
ClassFileLocator
TypePool
组合来创建一个类型描述,您可以提供给Byte Buddy


如果有必要,类型池将在类文件定位器中查询由插入指令的类链接的其他类。因此,您不能只提供原始字节数组,而需要提供更丰富的结构。

谢谢Rafael!我想知道,根据这个答案发布的日期,是否已经创建了一些新的机制来允许修改类的字节码,即使TypePool在类路径中找不到此类依赖项?因为,我认为利用Bute Buddy的API的简单性来按需修改单个类是非常方便的,特别是在编译时检测类时,类不需要加载。除非需要解析类,否则Byte Buddy不会解析它。你试过了吗?你遇到了什么异常?我正在处理的用例每次只提供一个类,我只能从中获取其字节数组,因此,例如,如果我的项目中有两个类,a.class和B.class,当我从API获取a.class字节数组时,我使用它创建一个ByteBuddy实例,如果所说的类与B.class没有联系,那么一切都很好,但是,如果例如A.class扩展了B.class,那么我会得到类似“无法解析B的类型描述”的结果。我想截取一些A.class方法,只是为了用一些代码包装它,但是因为它扩展了B.class,
rebase
方法失败。您可以通过禁用验证来避免它:
new ByteBuddy()。with(TypeValidation.DISABLED)
。从堆栈跟踪中,您应该能够找出解析B的原因,以了解Byte Buddy需要该信息的原因。你唯一的办法就是避免这种特殊的行为。