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

时间:2017-05-01 19:08:22

标签: java byte-buddy

如果我上课,请说:

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可以公开那个私有变量供我检查(或修改我猜,但对于我的用例,只读是好的)?

1 个答案:

答案 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