繁体   English   中英

使用ByteBuddy访问被拦截的类中的私有字段

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

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