2017-05-01 76 views
1

如果我有一類,說:訪問私有字段中截獲類,使用ByteBuddy

public class Foo { 
    private String name; 

    //... 

    public void someMethod(Object someArg) { 
    } 
} 

..我想攔截「的someMethod」,使用Java代理,所以我一起做一些事情的線路:

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暴露該私有變量爲我檢查(或修改我猜,但對於我的用例,只讀是好的)?

回答

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

+0

啊對。得到它了。這對我來說非常合適,因爲我只需要讀取訪問權限。謝謝。 – pconnell