gpt4 book ai didi

java - 使用 Byte Buddy 重新转换类

转载 作者:行者123 更新时间:2023-11-30 07:32:03 26 4
gpt4 key购买 nike

Byte Buddy 是否能够Instrumentation#retransformClasses 已经加载的内容?我想使用 Byte Buddy 的 Java 代理功能,这样我就不必指定 -javaagent 来检测类。例如,使用 Javassist 可以实现这一点。但我正在评估将其替换为 Byte Buddy。

我想在某些方法之前和之后插入静态方法调用。如果可能的话,一个简短的例子就太好了!

最佳答案

是的,您可以使用 AgentBuilder API 来启用重新转换。安装代理后,Byte Buddy 将重新转换所有已加载的类。您可以像这样启用重新转换:

AgentBuilder builder = new AgentBuilder.Default()    
.with(RedefinitionStrategy.RETRANSFORMATION)
.with(InitializationStrategy.NoOp.INSTANCE)
.with(TypeStrategy.Default.REDEFINE);

您可能想知道需要转动的不同开关:

  1. 您需要启用重新定义(根据检测 API 进行重新定义或重新转换)。

  2. 您需要禁用显式初始化策略。否则,Byte Buddy 会尝试将显式初始化程序添加到任何生成的类中,以便在加载该类后将任何值注入(inject)到该类中。这将更改 HotSpot VM 当前实现不支持的类布局。

  3. 如前所述,检测 API 的一个限制是您无法添加任何新方法。默认情况下,Byte Buddy 会将任何拦截方法的代码复制到一个新方法中,这违反了这一原则。通过启用重新定义类型策略,您可以确保 Byte Buddy 永远不会对方法进行 rebase 。

或者,您可以选择不使用 Byte Buddy 的拦截 API,该 API 现在完全替换了被拦截的方法,而是使用最近添加的 Advice 类进行手动重新定义。

这样,您可以通过建议您自己的代码来增强现有代码,例如 Advice.to(Foo.class),其中引用类的字节代码插入到被拦截的方法之前和之后:

class Foo {
@Advice.OnMethodEnter
@Advice.OnMethodExit
private static void intercept() {
System.out.println("Before/after");
}
}

您可以在 Advice 的 javadoc 中找到更多信息。

关于java - 使用 Byte Buddy 重新转换类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35968530/

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