cglib动态代理的使用方式

 典型用途:动态代理,构建AOP框架
 cglib的实现原理:ASM(Java字节码操控框架,这块待学习)

 架包:cglib-nodep-3.1.jar

 上代码:
     一个普通的接口:

 public interface Interface {
     public boolean check();
     public void execute();
 }

     cglib部分,通用方法动态代理类:

 /* 动态代理类 */
 public class Interceptor implements MethodInterceptor {

     /* 通过cglib创建的对象,在调用任何方法时,都会进入这里 */
     @Override
     public Object intercept(Object object, Method method, Object[] params, MethodProxy methodProxy) {

         /* 这个方法里实现具体的各种处理 */

         /* 获取类的类型 */
         Class<?> classClas = object.getClass();
         /* 获取调用方法的名称 */
         String methodName = method.getName();
         /* 获取调用方法的返回类型 */
         Class<?> returnType = method.getReturnType();
 
         /* 调用参数 */
         for(Object param : params){
         }

         /* 可以根据不同类型进行不同处理 */
         /* 如果返回类型是void,则returnType为null */
         if (returnType == null) {
             System.out.println("cglib");
             return null;
         } else if (returnType == boolean.class) {
             return true;
         } else... {
             return null;
         }
        
         /* 也可以进行原方法的调用,当然,必须有实体方法 */
         /* return methodProxy.invokeSuper(object, params); */
         /* 这种方式调用方法,会再次进入动态代理类处理 */
         /* return methodProxy.invoke(object, params); */
     }
 }

    cglib部分,创建对象

 /* 可以理解为对象创建工厂 */
 Enhancer enhancer = new Enhancer();
 /* 设置对象类型 */
 enhancer.setSuperclass(Interface.class);
 /* 注入动态代理类 */
 enhancer.setCallback(new Interceptor());
 /* 生产实体对象 */
 Interface i = enhancer.create();

 /* 调用方法时,都会进入Interceptor.intercept()进行处理 */
 i.check();
 i.execute();

     上面的例子里,虽然Interface接口虽然没有具体的实现类,但依然可以创建对象并进行调用。

你可能感兴趣的:(cglib动态代理的使用方式)