当前位置: 首页 > article >正文

代理模式-动态代理

原理:反射

场景:AOP 

一、类有接口-JDK代理

interface PeoPle{
    void work();
    String eat(String food);
}

class Man implements PeoPle{

    @Override
    public void work() {
        System.out.println("I am work");
    }

    @Override
    public String eat(String food) {
        System.out.println("我喜欢吃"+ food);
        return food;
    }
}

class ManProxy implements InvocationHandler{
    private static Object object;

    public static Object getProxyInstance(Object obj) {
        object = obj;
        /**
         * newProxyInstance():此方法用于返回一个代理类的对象,
         * 第一个参数为被代理类的类加载器,
         * 第二个参数为被代理类所实现的接口,
         * 第三个参数是代理类 代理 被代理类 要执行的方法所在的类的实例(当我们通过代理类的对象,调用方法a时,会自动调用下面的invoke()方法)
         */
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),
                object.getClass().getInterfaces(),new ManProxy());
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Exception {
        //JDK动态代理的增强方法
        handle();
        System.out.println("拦截方法"+method);
        System.out.println("方法参数:" + Arrays.toString(args));
        //我们可以在此方法 Object obj = method.invoke(targetObject,args);前后新增方法可以增强原方法
        return method.invoke(object,args);
    }
    private void handle(){
        //处理一些业务逻辑
        System.out.println("JDKProxy处理业务逻辑");
    }
}

public class JDKProxy{


    public static void main(String[] args) throws Exception{
        Man man = new Man();
        PeoPle proxyInstance = (PeoPle) ManProxy.getProxyInstance(man);
        String foods = proxyInstance.eat("foods");
    }
}

二、类无接口-CGLIB代理

class Animal{
    public String eat(String food){
        return food;
    }
    public void call(String str){
        System.out.println("Animal is "+ str + " call");
    }
}

public class CGLBProxy implements MethodInterceptor {
    // CGlib需要代理的目标对象
    private Object targetObject;

    public Object createProxyObject(Class obj) throws Exception{
        this.targetObject = obj.newInstance();
        //1.工具类
        Enhancer enhancer = new Enhancer();
        //2.设置父类
        enhancer.setSuperclass(targetObject.getClass());
        //3.设置回调函数
        enhancer.setCallback(this);
        System.out.println("this -> "+this);

        //4.创建子类(代理对象)
        Object proxyObj = enhancer.create();

        return proxyObj;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("这是增强方法前......");
        System.out.println("获取拦截方法:" + method.getName());
        System.out.println("获取方法参数:" + Arrays.toString(args));
        System.out.println("MethodProxy:" + methodProxy);
        Object obj = method.invoke(targetObject, args);
        System.out.println("这是增强方法后......");
        //模拟一下新增部分业务逻辑
        handle();
        return obj;
    }
    private void handle(){
        //处理一些业务逻辑
        System.out.println("CGLibProxy处理业务逻辑");
    }

    public static void main(String[] args) throws Exception{
        Animal proxyObject = (Animal) new CGLBProxy().createProxyObject(Animal.class);
        proxyObject.call("miao miao");
        String food = proxyObject.eat("food");
        System.out.println(food);
    }
}


http://www.kler.cn/a/311477.html

相关文章:

  • sqoop import将Oracle数据加载至hive,数据量变少,只能导入一个mapper的数据量
  • CSP/信奥赛C++语法基础刷题训练(1):洛谷P5715 :三位数排序
  • uniapp分享功能
  • AI大模型开发架构设计(14)——基于LangChain大模型的案例架构实战
  • [vulnhub] DarkHole: 1
  • 微服务架构面试内容整理-监控与追踪-Zipkin
  • Vue3:defineProps接收父组件传递的数据
  • java八股文之Redis
  • Git 分支规范
  • 【Redis】个人笔记
  • java项目之在线考试与学习交流网页平台源码(springboot)
  • Ruby-SAML CVE-2024-45409 漏洞解决方案
  • 【快速笔记】freeRTOS
  • Loki 分布式日志中心服务
  • Hive基本原理与数据开发
  • 唯徳知识产权管理系统 UploadFileWordTemplate 任意文件读取
  • 开源项目 GAN 漫画风格化 UGATIT
  • 如何借助项目管理系统实现审批流程的自动化与标准化?
  • 无人机 PX4 飞控 | EKF 使用传感器汇总与添加传感器方法
  • Photoshop使用方法大全
  • Zookeeper工作机制和特点
  • 软件验收测试报告模版分享?专业软件验收测试公司推荐
  • 如何安装和注册 GitLab Runner
  • 【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
  • 单片机,传感器等低功耗管理
  • 模块化编程:构建灵活与高效的系统