java提供的基于Proxy、InvocationHandler的动态代理由于只能创建接口的代理对象,在实际应用中不能很好的满足需要,针对这个问题,另外一个开源框架cglib提供了一种实现方式,可以针对类进行代理对象的创建。
CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
其中Hibernate懒加载使用的代理方式就是Cglib动态代理
实例如下:
1、原始对象:
public class Operate {
public void delete(){
System.out.println("删除操作");
}
}
2、代理实现:
public class CglibProxy implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
/**
* 生成代理子类
* @param clazz
* @return
*/
@SuppressWarnings("rawtypes")
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 拦截方法
* object 代理对象实例
* method 原始对象的方法名
* arg2 传递给方法的实际入参
* proxy 与源对象中的method相对应的代理对象中的方法
*/
@Override
public Object intercept(Object object, Method method, Object[] arg2, MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
System.out.println("前置操作");
Object result = proxy.invokeSuper(object, arg2);
System.out.println("后置操作");
return result;
}
}
3、客户端实现:
public class Client {
public static void main(String []args){
CglibProxy cglibProxy = new CglibProxy();
Operate operate = (Operate)cglibProxy.getProxy(Operate.class);
operate.delete();
}
}
运行结果:
前置操作
删除操作
后置操作
以上可以看出cglib代理可以实现没有接口类的proxy代理