繁体   English   中英

从基类访问私有字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM