/**

 *代理类对象,是目标对象的子类

 */

publicclass CglibProxy {

 

    /**

     * 创建Cglib动态代理对象

     * @param targetObejct 目标对象

     * @param t 扩展对象,是一个拦截器

     * @return代理对象

     */

    publicstatic ObjectnewProxyInstance(UserDAOImpl targetObejct,TimeInterceptor t) {

      

       //字节码增强工具,可以在内存中动态产生字节码

       Enhanceren = new Enhancer();

       en.setSuperclass(targetObejct.getClass());//指定代理类的父类

       en.setCallback(t);//代理类对应的扩展对象。

      

       return en.create(); //创建代理对象返回

    }

   

}

/**

 *扩展类对象

 */

publicclass TimeInterceptor implements MethodInterceptor{

 

    @Override

    public Objectintercept(Object proxyObject, Method method, Object[] args, MethodProxymethodProxy) throws Throwable {

       //扩展代码

       System.out.println("start time:" +new Date());

      

//method为targetObject的方法名,也可以反射调用

       //Object result = method.invoke(targetObejct, args);

      

//可以通过代理方法对象,调用父类的方法。

       Objectresult = methodProxy.invokeSuper(proxyObject, args);   

 

       //扩展代码

       System.out.println("end time:" +new Date());

       return result;

    }

   

}

/**

 *目标类对象

 */

publicclass UserDAOImpl{

 

    publicvoid delete() {

       System.out.println("delete ... ");

    }

 

 

    publicvoid insert() {

       System.out.println("insert ... ");

    }

 

    publicvoid select() {

       System.out.println("select ... ");

    }

 

 

    publicvoid update() {

       System.out.println("select ... ");

    }

 

}

/**

 *测试

 */

publicclass TestCglibProxy {

 

    publicstaticvoid main(String[] args){

       //目标对象

       UserDAOImpltargetObejct = new UserDAOImpl();

      

       //扩展对象

       //TimeInterceptor t = new TimeInterceptor(targetObejct);

       TimeInterceptort = new TimeInterceptor();

      

       //Cglib代理对象: 代理类继承目标类

       ObjectproxyObject = CglibProxy.newProxyInstance(targetObejct,t);

 

       //因为代理类是目标类的子类,所以可以将对象转换为目标对象类型

UserDAOImpl proxy = (UserDAOImpl)proxyObject;

       //调用代理对象的方法,会自动调用到扩展对象的intercept方法。

proxy.insert();     

       proxy.delete();

    }

 

}