[英]Accessing private field from base class
我有一个使用 AgentBuilder 通过 MethodDelegation 进行拦截的代理。 我目前在基类的受保护记录器字段上使用@FieldValue,但我还需要获取私有标头字段。 最好的解决方法是什么?
要修补的类:
public class EventImpl extends EventBase {
@Override
public String send(String url, String payload) {
return send(url, payload, String.class);
}
}
public class EventBase {
private final Headers header;
protected final Logger logger;
// etc
变压器:
public class EventImplTransformer {
public static void transformClasses(Instrumentation inst) {
new AgentBuilder.Default()
.with(new Listener())
.type(named("com.whatever.EventImpl")
.and(not(isInterface())))
.transform((builder, type, classLoader, module) -> builder
.method(hasMethodName("send")
.and(takesArguments(String.class, String.class)
.and(returns(String.class))))
.intercept(MethodDelegation.to(EventImplTransformer.class)))
.installOn(inst);
}
@RuntimeType
public static String send(String url, String payload,
@FieldValue("logger") Logger logger,
// doesn’t intercept if included @FieldValue("header") Headers header,
@SuperCall Callable<?> callableMethod) throws Exception {
return "string";
}
}
尝试转换基类以将字段更改为受保护。
new AgentBuilder.Default()
.with(new Listener())
.type(named("EventBase")
.and(not(isInterface())))
.transform((builder, type, classLoader, module) -> builder
.field(named("header"))
.transform(Transformer.ForField.withModifiers(Visibility.PROTECTED)))
.installOn(inst);
这不可能。
Byte Buddy 生成并操作仍由 JVM 处理的字节码。 如果它拒绝字节码,它就不会被加载或执行。
一种可能的解决方法是深入反思或更改基类的修饰符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.