如果我上课,请说:
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可以公开那个私有变量供我检查(或修改我猜,但对于我的用例,只读是好的)?
答案 0 :(得分:2)
如果您只想阅读值,可以使用@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
。