CGLIB代理
JDK动态代理必须提供一些接口才能代理,在一些不能提供的接口环境下,只能采取其他第三方技术,比如CGLIB动态代理,他的优势在于不需要提供接口,只要一个非抽象类就能实现动态代理。
非抽象类ReflectServiceImpl
package com.lean.ssm.chapter.cglib;
public class ReflectServiceImpl {
public void sayHello(String name){
System.err.println("Hello"+name);
}
}
cglib代理代码的实现
public class CglibProxyExample implements MethodInterceptor{
/**
* 生成CGLIB代理对象
* cls -class类
* Class类的CGLIB对象
*/
public Object getProxy(Class cls){
// CGLIB enhancer增强类对象
Enhancer enhancer=new Enhancer();
// 设置增强类型
enhancer.setSuperclass(cls);
// 定义代理逻辑对象为当前对象,要求当前对象实现MethodInterceptor方法
enhancer.setCallback((Callback) this);
// 生成并返回代理对象
return enhancer.create();
}
/**
*
* 代理逻辑对象
* proxy 代理对象
* args 方法参数
* methodProxy 方法代理
* return 代理逻辑返回
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodproxy) throws Throwable {
// TODO Auto-generated method stub
System.err.println("调用真实对象前");
// CGLIB反射调用真实对象方法
Object result=methodproxy.invokeSuper(proxy, args);
System.err.println("调用真实对象后");
return result;
}
public static void main(String[] args) {
CglibProxyExample cpe=new CglibProxyExample();
ReflectServiceImpl obj=(ReflectServiceImpl) cpe.getProxy(ReflectServiceImpl.class);
obj.sayHello("张三");
}
}
这里运用了CGLIB的加强者Enhancer,通过在设置超类的方法(setsuperClass),然后通过setCallback方法设置哪个类为它的代理类,其中,参数为this就意味着当前的对象,那就要求用this这个对象实现接口MethodInterceptor的方法,inteceptor然后返回代理对象。
那么此时的当前类的inteceptor方法就是其代理逻辑方法,其参数内容见代码注解,我们在反射真实对象的方法前后进行了打印,CGLIB是通过如下代码完成:
// CGLIB反射调用真实对象方法 Object result=methodproxy.invokeSuper(proxy, args);
测试一下CGLIB的动态代理
CglibProxyExample cpe=new CglibProxyExample();
ReflectServiceImpl obj=(ReflectServiceImpl) cpe.getProxy(ReflectServiceImpl.class);
obj.sayHello("张三");
网友评论