cglib动态代理的优点是可以代理类,无需接口.
但是也有缺点,因为原理是生成子类代理,所以带final修饰符的方法无法被代理
AOPTest.zip附件包含 反射例子,静态代理,jdk动态代理,cglib动态代理,以及所需的jar包
以下是测试代码
//Cat.java package com.memorycat.aoptest.cglib; public class Cat { void eat(String food) { System.out.println("猫吃" + food); } String type() { System.out.println("Cat - String type()"); return "猫科动物"; } final void sleep() { // 注意,这个带final修饰词的方法不会被代理,因为final不能被子类重写 System.out.println("MemoryCat拍着睡觉的"); } }
//CatMethodInterceptor.java package com.memorycat.aoptest.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CatMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub System.out.println("******这是调用方法前加入自己的代码"); Object retObj = proxy.invokeSuper(obj, args); System.out.println("######这是调用方法后加入自己的代码"); System.out.println(); return retObj; } }
//测试代码 package com.memorycat.aoptest.cglib; import net.sf.cglib.proxy.Enhancer; public class Tester { public static void main(String[] args) { Cat cat = (Cat) Enhancer.create(Cat.class, new CatMethodInterceptor()); cat.eat("牛奶"); System.out.println("猫是" + cat.type()); cat.sleep(); } }最后是运行结果
******这是调用方法前加入自己的代码 猫吃牛奶 ######这是调用方法后加入自己的代码 ******这是调用方法前加入自己的代码 Cat - String type() ######这是调用方法后加入自己的代码 猫是猫科动物 MemoryCat拍着睡觉的