2017-09-03 3 views
0

Je veux intercepter la méthode nommée methodA avec un argument dont le type est String comme blow, que dois-je faire. Comment utiliser hasParameters() api?comment intercepter une méthode avec des paramètres spécifiques avec bytebuddy

public class Demo {

public static void main(String[] args) { 

    new ByteBuddy() 
      .subclass(A.class) 
      .method(named("methodA").and(hasParameters(?))) 
} 


static class A { 

    public void methodA() { 
     System.out.println("methodA() invoked."); 
    } 

    public void methodA(String arg) { 
     System.out.println("methodA(" + arg + ") invoked."); 
    } 
} 

}

Répondre

1

Pour cela, vous voulez que le ElementMatchers.takesArguments(String.class) matcher.

donc quelque chose comme ça:

Class<? extends A> loaded = new ByteBuddy().subclass(A.class) 
     .method(ElementMatchers.named("methodA").and(ElementMatchers.takesArguments(String.class))) 
     .intercept(MethodDelegation.to(Demo.class)) 
     .make().load(Demo.class.getClassLoader(), ClassLoadingStrategy.Default.INJECTION).getLoaded(); 

    A instance = loaded.getConstructor().newInstance(); 
    instance.methodA("abc"); 
    instance.methodA(); 


public class Demo { 

    static void intercept(String arg){ 
     System.out.println("intercepted"); 
    } 
} 
+0

Merci beaucoup. J'utilise la méthode ElementMatchers.hasParameters et implémente ElementMatcher > pour atteindre mon but finalement, et cela fonctionne bien. – MengZhi