[英]Accessing private fields in an intercepted class, using ByteBuddy
如果我有课,请说:
public class Foo {
private String name;
//...
public void someMethod(Object someArg) {
}
}
..并且我想使用Java Agent截取'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类的“名称”字段的方法?
ByteBuddy可以公开该私有变量供我检查(或修改我猜吗,但是对于我的用例,只读就可以了)?
如果只想读取一个值,则可以使用@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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.