• jdk代理和cglib代理


    1.jdk代理

    描述:jdk代理,就是一个类A实现某个接口G,重写了G的方法。现在要对A的方法进行增强,但是不要修改A的代码。所以创建类B,也实现接口G,在这个方法里面写增强业务,但是具体方法调用A的。
    要求:

    • 被代理的类必须实现接口

    核心类

    • Proxy 是jdk提供的代理类
    • newProxyInstance(被代理类的类加载器,被代理类的接口,业务处理接口) 静态方法,用于创建一个代理实例
    • InvocationHandler 具体代理业务处理的方法
      核心代码:

    动物接口接口:

    public interface Animal{
         void swimming();
    }
    
    
    • 1
    • 2
    • 3
    • 4

    狗类

    public class Dog implements Animal{
        @Override
        public void swimming(){
            System.out.println("狗正在游泳");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    生成代理:

    /**
     * jdk的动态代理
     * 实现动态代理的要求是,必须有接口实现。
     * 所生成的代理对象也是实现这个接口的,只是具体的方法调用,来自被代理的对象的
     */
    public class P7 {
        public static void main(String[] args) {
            DogProxy dogProxy = new DogProxy();
            Animal dogProxyInstance = (Animal) dogProxy.getInstance(new Dog());
            dogProxyInstance.swimming();
        }
    }
    
    /**
     * 对狗进行代理,从而改良狗的行为.
     */
    class DogProxy implements InvocationHandler {
        private Object target;
        public Object getInstance(Object target){
            this.target=target;
            //实现代理
            return Proxy.newProxyInstance(
                    this.target.getClass().getClassLoader(),
                    this.target.getClass().getInterfaces(),
                    this
            );
        }
    
        //代理所做处理的具体业务
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("当前时间:"+System.currentTimeMillis()+" 使用狗刨式");
            Object o = method.invoke(this.target, args);//调用 [被代理的方法]
            System.out.println("结束时间:"+System.currentTimeMillis()+ "使用仰泳式");
            return o;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    2.cglib代理

    描述:cglib代理又称子类代理。一个类A,要对其方法进行增强,但是,这个类没有实现接口。现在创建一个类继承类A,重写方法,但是具体业务还是调用父类的。只是在这个方法里面进行额外添加小功能而已。
    要求:

    • 被代理的类不能被final修饰

    核心类:

    • Enhancer :增强器类,用于创建代理对象的类
    • setSuperclass(Object target):设置目标要代理的对象,即设置父类对象
    • setCallback(Callback[] callbacks):设置代理业务的具体处理,参数是实现MethodInterceptor 接口类的实例对象
    • create():调用此方法,创建代理对象

    核心代码:
    被代理的类: pig类

    class Pig{
        public void sing(){
            System.out.println("this pig is singing");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    代理类:

    /**
     * 进行CGlib代理的类
     */
    class CglibPig implements MethodInterceptor {
        private Object target;
    
        public Object getInstance(Object target) {
            this.target = target;
            Enhancer enhancer=new Enhancer();
            //指定被代理的对象  即父类
            enhancer.setSuperclass(this.target.getClass());
            //设置代理处理的回调  MethodInterceptor的实现类
            enhancer.setCallback(this);
            //创建代理对象
            Object o = enhancer.create();
            //返回
            return o;
        }
    
        /**
         *进行代理处理的业务
         */
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("参数查看:");
            System.out.println(o.getClass());  //当前代理对象
            System.out.println(method.getClass()); //代理对象的方法
            System.out.println(Arrays.toString(objects));  //代理对象的参数
            System.out.println(methodProxy.getClass()); 
            System.out.println("cglib,小猪唱歌前,准备热身");
            //因为是子类代理,所有要调用父类的方法
            Object o1 = methodProxy.invokeSuper(o, objects);
            System.out.println("cglib,小猪唱歌后,全身都是汗");
            return o1;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    main类演示:

    public class P6 {
        public static void main(String[] args) {
            //创建代理对象,指定被代理的类
            CglibPig cglibPig=new CglibPig();
            Pig p= (Pig)cglibPig.getInstance(new Pig());
            System.out.println(p.getClass());
            p.sing();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

  • 相关阅读:
    大学生餐饮主题网页制作 美食网页设计模板 学生静态网页作业成品 dreamweaver美食甜品蛋糕HTML网站制作
    Go - 用户服务和Web服务
    VMware17Pro虚拟机安装macOS教程(超详细)
    <Python>PyQt5+OpenCv+Dlib人脸合成程序
    编程(47)----------Spring AOP
    NFT软件开发:什么是数字藏品?
    使用 Django Rest Framework 构建强大的 Web API
    Java纯注解开发模式
    【Node.JS 】http的概念及作用
    来聊一聊MySQL InnoDB的LSN
  • 原文地址:https://blog.csdn.net/weixin_48917089/article/details/126885785