Spring 之 Cglib (動態代理)
Cglib 的FastClass 會比一般的java的動態代理快很多。下面代碼中有簡單的說明
/**
* @ClassName TargetPojo
* @Author 莫邪
* @Description TODO
* @Date Created in 0:17 2020/4/8
* @Version 1.0
*/
//被代理的類
public class TargetPojo {
public void pojoMethod(){
System.out.println("TargetPojo pojoMethod run");
}
}
/**
* @ClassName DefaultMethodInterceptor
* @Author 莫邪
* @Description TODO
* @Date Created in 0:38 2020/4/8
* @Version 1.0
*/
//默認的代理方法實現接口,cglib 定義被代理後會執行的接口方法
public class DefaultMethodInterceptor implements MethodInterceptor {
private Object target;//被代理對象
public DefaultMethodInterceptor(Object target){
this.target =target;
}
@Override
public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println(proxy.getClass());//生成的代理類
System.out.println(methodProxy.getSuperName());
before(method);
// Object res = method.invoke(target, objects);
Object res = methodProxy.invokeSuper(proxy,objects);//直接執行父類的方法不走反射 FastClas優化 爲代理類和被代理類都生成來了一個,要執行的方法直接通過索引下標去導航(耗內存,但是快)
return res;
}
private void before(Method method){
System.out.println("before method:" + method.getName());
}
}
/**
* @ClassName CglibUtil
* @Author 莫邪
* @Description TODO
* @Date Created in 0:22 2020/4/8
* @Version 1.0
*/
//Cglib 代理工具類
public class CglibUtil {
public static <E>E getCglibProxy(E target, MethodInterceptor methodInterceptor){
// System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\class");//輸出生成的代理類,可以用於分析
if(methodInterceptor==null){
methodInterceptor= new DefaultMethodInterceptor(target);
}
E o =(E) Enhancer.create(target.getClass(), methodInterceptor);
return o;
}
}
/**
* @ClassName CglibEg1
* @Author 莫邪
* @Description TODO
* @Date Created in 0:18 2020/4/8
* @Version 1.0
*/
//cglib使用案例
public class CglibEg1 {
public static void main(String[] args) {
TargetPojo proxy = CglibUtil.getCglibProxy(new TargetPojo(), null);
proxy.pojoMethod();
System.out.println("打印生成的代理類");
Method[] methods = proxy.getClass().getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
}
}