cglib代理的实现
1. cglib代理与jdk动态代理的区别在于,jdk动态要代理的类(目标类)必须是实现某个 接口的类,才可以对其进行代理。 而cglib代理则可以对任意类进行代理,底层是创建目 标类的子类。
2. 实现cglib代理所需jar: asm-2.2.3.jar,cglib-nodep-2.2.2.jar. 自行到maven公库下载
3. 实现代码:
// 创建一个对象(作为即将要代理的目标类)
public class Hello {
public void say(String name) {
System.out.println(" hello" + name);
}
}
// 创建cglib代理类
public class CglibProxy implements MethodInterceptor {
private Object target;
/**
* 创建代理对象方法
*/
@SuppressWarnings("unchecked")
public <T> T createProxy(Object target) {
// 要代理的目标类
this.target = target;
//创建Enhancer对象
Enhancer enhancer = new Enhancer();
//设置要代理的目标类,以扩展功能
enhancer.setSuperclass(this.target.getClass());
//设置单一回调对象,在回调中拦截对目标方法的调用
enhancer.setCallback(this);
//设置类加载器
enhancer.setClassLoader(target.getClass().getClassLoader());
//创建代理对象
return (T)enhancer.create();
}
@Override
/**
* 重写intercept方法
*/
public Object intercept(Object obj, Method method, Object[] params,
MethodProxy methodProxy) throws Throwable {
System.out.println("前置......");
// methodProxy.invokeSuper(obj, params);
methodProxy.invoke(target, params);
System.out.println("后置.....");
return null;
}
}
// 写一个测试类
public class TestCglibProxy {
public static void main(String[] args) {
Hello helloCglibProxy = new CglibProxy().createProxy(new Hello());
helloCglibProxy.say(" cglib");
}}