有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

如果我有课,说:

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

  1. # 1 楼答案

    如果只想读取一个值,可以使用@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