gpt4 book ai didi

java - 如何使用 bytebuddy 向类添加私有(private)字段

转载 作者:太空宇宙 更新时间:2023-11-04 10:43:44 33 4
gpt4 key购买 nike

我有一堂这样的课

public class SampleClass {

public void startMethod(int no){
//some works!!
}
public void endMethod(String name){
//some works!!
}
}

我正在使用Advice来获取此方法的指标。

public class TimerAdvice {

@Advice.OnMethodEnter
static void enter(@Advice.Origin String method){

if (method.equals("startMethod")) {
//Metrics works
}

}

@Advice.OnMethodExit
static void exit(@Advice.Origin String method){
if (method.equals("endMethod")) {
//Metrics works
}
}
}
}

我想将 @Advice.OnMethodEnter 中的指标计时器(或任何字段)添加到 SampleClass 并从 @Advice.OnMethodExit 获取它这是可以做到的吗?我想我的问题已经很清楚了。

最佳答案

您必须为每个建议方法定义两个类,然后将每个建议应用于您想要更改的方法。您可以使用 Byte Buddy 的类型构建器 API 定义字段:

new ByteBuddy()
.redefine(SampleClass.class)
.visit(Advice.to(TimerAdviceStart.class).on(named("startMethod"))
.visit(Advice.to(TimerAdviceEnd.class).on(named("endMethod"))
.defineField("foo", long.class, Visibility.PRIVATE)
.make();

您现在可以使用 @Advice.Field 读取和写入 foo 字段。但是,由于线程问题,您应该小心。

此外,对于重新定义 Java 代理的类,无法执行此操作,因为 JVM 禁止向已加载的类添加字段。

关于java - 如何使用 bytebuddy 向类添加私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48656471/

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