1、 CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。  2、 用CGlib生成代理类是目标类的子类。  3、 用CGlib生成 代理类不需要接口  4、 用CGLib生成的代理类重写了父类的各个方法。  5、 拦截器中的intercept方法内容正好就是代理类中的方法体

代码


    // 定义接口
    public interface FooDao {
        void doSomething();
    }

    // 定义实现
    static class FooDaoImpl implements FooDao{
        @Override
        public void doSomething() {
            System.out.println("Impl....");
        }
    }
		
		
    static class FooProxyCjlib implements MethodInterceptor {

        private Object target;

        // 持有被代理对象
        public FooProxyCjlib(Object target) {
            this.target = target;
        }

        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("before");
            Object invoke = method.invoke(target, objects);
            System.out.println("after");
            return invoke;
        }
    }


    public static void main(String[] args) {
        // 原服务
        FooDao fooDao = new FooDaoImpl();
        // 代理服务
        FooProxyCjlib cjLibProxySubject = new FooProxyCjlib(fooDao);
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(fooDao.getClass());
        enhancer.setCallback(cjLibProxySubject);
        FooDao proxyDao = (FooDao) enhancer.create();

        // 打印原服务类名
        System.out.println(fooDao.getClass().getName());
        // 原服务输出
        fooDao.doSomething();
        System.out.println("-------");

        // 打印代理服务类名
        System.out.println(proxyDao.getClass().getName());
        // 代理服务执行
        proxyDao.doSomething();
        System.out.println("-------");
    }

输出结果:

cn.nzcong.xxxxxx.xxxxxx$FooDaoImpl
Impl....
-------
cn.nzcong.xxxxxx.xxxxxx$FooDaoImpl$$EnhancerByCGLIB$$3d31426d
before
Impl....
after
-------