jdk的动态代理和CGLIB的区别

jdk的动态代理和CGLIB的区别
先说一下我对代理的理解:
    我们租房或者买房的时候,我们只关注房子多大,多少钱,还有一些其他需求,但是这个过程有时候需要你自己
    去找资源,要商量价格,要自己拟定合同的内容,我们上班哪有那么多时间去管这些事呢,因此中介油然而生,
    中介帮你完成我们与自己需求不关注的点,这就跟代理类是一个意思。
jdk代理是基于接口实现类来说的,如果你没有实现接口,则不给你代理:
    当一个实现类实现一个接口时,实现类实现了接口的方法。在实际开发过程中我们最重要的是实现业务逻辑,
    但是有一些像日志之类的功能跟业务没有多大关系,所以就需要让别的类来现实日志功能,这时候就需要代理类来
    帮助我们完成这个任务。
    代理的大概原理就是:代理类实现接口的方法,在实现的方法里,自己可以想怎么玩怎么玩,玩完之后再调取
    甲方(也就是谁让我们代理那个实现类)对应的方法,执行完我还可以想干什么干什么。
CGLIB与jdk代理不同的是 CGLIB是继承类方式来实现的,这种缺点就是不能代理final修饰的类

注:利用aop实现事务功能时,要注意项目对应的包下的类是否是通过接口来实现的,这是事务不起作用的可能原因。

 

jdk动态代理参数解析

        UserEntity userEntity = new UserEntity();
            //目标类的类加载器
        ClassLoader loader = userEntity.getClass().getClassLoader();
        //目标类实现得接口
        Class[] interfaces = userEntity.getClass().getInterfaces();
        //处理类
        InvocationHandler h = new InvocationHandler() {
            /**
             *
             * @param proxy jdk用的对象 不用管
             * @param method 目标类得执行方法
             * @param args 目标类得执行参数
             * @return  返回结果
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object invoke = method.invoke(userEntity, args);
                return invoke;
            }
        };
        Object o = Proxy.newProxyInstance(loader,interfaces,h);

 

你可能感兴趣的:(初级程序要的成长之路)