gpt4 book ai didi

java - 使用 ByteBuddy 访问被拦截类中的私有(private)字段

转载 作者:行者123 更新时间:2023-11-30 02:33:25 27 4
gpt4 key购买 nike

如果我有课,请说:

public class Foo {
private String name;

//...

public void someMethod(Object someArg) {
}
}

..我想使用Java代理拦截'someMethod',所以我做了一些类似的事情:

public static void premain(String args, Instrumentation inst) {

new AgentBuilder.Default()
.type(ElementMatchers.named("Foo"))
.transform((builder, typeDescription, classLoader, module)
-> builder.method(
ElementMatchers.named("someMethod"))
.intercept(MethodDelegation.to(Interceptor.class))
)

.installOn(inst);
}

public class Interceptor() {
public static void intercept(
@AllArguments Object[] args,
@This Foo foo,
@SuperCall Callable zuper) {

if (foo.name.equals("BAR") //foo.name inaccessible here
zuper();
else {/*something else*/}
}
}

如何在拦截方法内使用 ByteBuddy 为我提供访问类 Foo 的“name”字段的方法?

ByteBuddy 可以公开该私有(private)变量供我检查(或者修改我猜的,但对于我的用例,只读就可以了)?

最佳答案

如果您只想读取值,可以使用@FieldValue注释:

public class Interceptor() {
public static void intercept(
@AllArguments Object[] args,
@FieldValue("name") String name,
@SuperCall Callable zuper) {
if (name.equals("BAR"))
zuper();
else {/*something else*/}
}
}

如果您想写入一个值,则必须使用(并安装)@FieldAccessor

关于java - 使用 ByteBuddy 访问被拦截类中的私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43724919/

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