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拍着睡觉的