Java动态代理全面分析(3)

public class Animal { public void bark() { System.out.println("i am 大黄!"); } public String singSong(String name) { return name + " is singing!"; } public String testt(String name) { return name + " is testing!"; } }

你现在想要在testt方法输出前后不加任何内容,但是另外两个方法输出前后要加一个字符串,效果如下:

BEFORE
i am 大黄!
AFTER
===============================
BEFORE
老刘 is singing!
AFTER
===============================
大黄 is testing!

其中=======是分隔线,上边两个方法前后都改变了,但是最后一个方法则没做任何改变还是原生的。如何做到?

首先我们要定义一个拦截器,该拦截器实现了 cgLib的MethodInterceptor,如下:

public class AnimalWrapper implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("BEFORE"); Object obj2 = proxy.invokeSuper(obj, args); System.out.println("AFTER"); return obj2; } }

再定义一个拦截器过滤器,如下:

public class ApiFilter implements CallbackFilter { @Override public int accept(Method method) { String name = method.getName(); if (name.length() == 5) { return 1; } return 0; } }

接下来看下测试类:

public class CglibTest { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Animal.class); enhancer.setCallbacks(new Callback[]{new AnimalWrapper(), NoOp.INSTANCE}); enhancer.setCallbackFilter(new ApiFilter()); Animal animal = (Animal) enhancer.create(); animal.bark(); System.out.println("==============================="); animal.singSong("老刘"); System.out.println("==============================="); animal.testt("大黄"); } }

CGLib通过 Enhancer、Callback、CallbackFilter就可以实现上述功能了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/709851a44903debe1c9d5318ac3b7981.html