你现在想要在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就可以实现上述功能了。