java使用ByteBuddy访问被截获类中的私有字段
如果我有课,说:
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是否可以公开这个私有变量供我检查(或者修改,但对于我的用例,只读是可以的)
# 1 楼答案
如果只想读取一个值,可以使用
@FieldValue
注释:如果你想写一个值,你必须使用(并安装)
@FieldAccessor