如何用特定参数用字节绑定



我想用一个名为nater的方法与一个arg的方法拦截,该方法是字符串为blow,我该怎么办。如何使用hasparameters()api?

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.");
        }
    }
}

为此,您想要ElementMatchers.takesArguments(String.class)匹配器。

这样的东西:

    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");
    }
}

要澄清,您需要定义匹配器(类似于过滤器)才能应用于方法。在匹配器中创建一些约束,因此它只能与您指定的某些参数结构匹配:

ElementMatcher<Iterable<? extends ParameterDescription>> matcher = parameterDescriptions -> {
    for (ParameterDescription p : parameterDescriptions) {
        if (p.getType().equals(TypeDescription.STRING.asGenericType()) && p.getIndex() == 0) return true;
    }
    return false;
};
ByteBuddyAgent.install();
new ByteBuddy()
    .redefine(SomeType.class)
    .method(ElementMatchers.hasParameters(matcher))
    .intercept(FixedValue.value("Hello World"))
    .make()
    .load(SomeType.class.getClassLoader(), 
        ClassReloadingStrategy.fromInstalledAgent());

最新更新