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

Java面试题系列 - 第17天

Java中的代理模式与动态代理

背景说明:代理模式是一种结构型设计模式,用于在客户端和目标对象之间提供一个代理或占位符。在Java中,动态代理技术允许在运行时创建代理对象,这在AOP(面向切面编程)和RPC(远程过程调用)等领域有广泛应用。

问题要求

  1. 解释代理模式的概念及其在Java中的应用。
  2. 描述Java动态代理的工作原理。
  3. 分析动态代理如何支持AOP和RPC。
  4. 提供一个使用Java动态代理的示例。

答案批注

  1. 代理模式的概念及其在Java中的应用:代理模式允许你提供一个替代或占位符对象来控制对一个对象的访问。在Java中,代理模式可以用于:

    • 延迟加载:在真正需要的时候才加载资源。
    • 远程代理:代表远程网络上的对象。
    • 虚拟代理:在大对象创建好之前,先用一个小的对象代替。
    • 保护代理:控制对一个对象的访问,比如权限控制。
    • 智能引用:当一个对象被引用时,做一些额外的操作,如计数或跟踪。
  2. Java动态代理的工作原理:Java动态代理主要通过java.lang.reflect.Proxy类和InvocationHandler接口实现。Proxy类提供了创建动态代理对象的方法,而InvocationHandler接口则定义了代理对象调用方法时的行为。当调用代理对象的方法时,实际上是调用了InvocationHandlerinvoke方法,这样就可以在调用前后添加额外的逻辑。

  3. 动态代理如何支持AOP和RPC:动态代理在AOP中用于实现横切关注点,如日志、事务管理等,可以在方法调用前后添加额外的行为。在RPC中,动态代理可以用于在网络两端创建透明的远程对象调用,客户端调用本地代理对象就像调用本地对象一样,而实际调用的是远程服务器上的对象。

  4. 使用Java动态代理的示例

     Java 

    浅色版本

    1import java.lang.reflect.InvocationHandler;
    2import java.lang.reflect.Method;
    3import java.lang.reflect.Proxy;
    4
    5interface Service {
    6    void doSomething();
    7}
    8
    9class RealService implements Service {
    10    @Override
    11    public void doSomething() {
    12        System.out.println("Doing something...");
    13    }
    14}
    15
    16class ServiceInvocationHandler implements InvocationHandler {
    17    private final Service target;
    18
    19    public ServiceInvocationHandler(Service target) {
    20        this.target = target;
    21    }
    22
    23    @Override
    24    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    25        System.out.println("Before method call");
    26        Object result = method.invoke(target, args);
    27        System.out.println("After method call");
    28        return result;
    29    }
    30}
    31
    32public class DynamicProxyExample {
    33    public static void main(String[] args) {
    34        Service realService = new RealService();
    35        Service proxyService = (Service) Proxy.newProxyInstance(
    36                Service.class.getClassLoader(),
    37                new Class[]{Service.class},
    38                new ServiceInvocationHandler(realService)
    39        );
    40        proxyService.doSomething();
    41    }
    42}

    在这个例子中,RealService是目标对象,ServiceInvocationHandlerInvocationHandler的实现,用于在调用方法前后添加额外的日志打印。DynamicProxyExample中的main方法创建了Service接口的动态代理对象,并调用了doSomething方法,可以看到在方法调用前后有额外的日志输出。

通过深入理解Java中的动态代理,开发者可以更灵活地实现AOP和RPC等高级功能,提高代码的可维护性和可扩展性

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • FreeRTOS的互斥锁(互斥信号量)使用
  • grafana大坑,es找不到时间戳 | No date field named timestamp found
  • C语言 | Leetcode C语言题解之第240题搜索二维矩阵II
  • 【BUG】已解决:java.lang.reflect.InvocationTargetException
  • 设计模式-Git-其他
  • 游戏常用运行库安装包 Game Runtime Libraries Package
  • 期值(future)
  • Linux_线程的同步与互斥
  • Elasticsearch基础(五):使用Kibana Discover探索数据
  • Mybatis——动态SQL常用标签
  • JavaWeb笔记_Cookie
  • 企业微信PC版应用跳转到默认浏览器,避坑指南,欢迎补充(Vue项目版)。。。
  • IVI(In-Vehicle Infotainment,智能座舱的信息娱乐系统)
  • 深度学习落地实战:人脸面部表情识别
  • 【Android Framewrok】Handler源码解析
  • 2019.2.20 c++ 知识梳理
  • Fabric架构演变之路
  • leetcode46 Permutation 排列组合
  • Nacos系列:Nacos的Java SDK使用
  • session共享问题解决方案
  • Unix命令
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 区块链分支循环
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 移动端解决方案学习记录
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #HarmonyOS:Web组件的使用
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (自用)仿写程序
  • **CI中自动类加载的用法总结
  • .describe() python_Python-Win32com-Excel
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • @NestedConfigurationProperty 注解用法
  • []Telit UC864E 拨号上网
  • [4]CUDA中的向量计算与并行通信模式
  • [C#]winform部署官方yolov10目标检测的onnx模型
  • [C++][数据结构][算法]单链式结构的深拷贝
  • [Docker]六.Docker自动部署nodejs以及golang项目
  • [Flexbox] Using order to rearrange flexbox children
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle
  • [HNOI2010]BUS 公交线路
  • [HTML API]HTMLCollection
  • [Kubernetes] etcd 单机和集群部署
  • [leetcode hot 150]第二十三题,合并K个升序链表
  • [leetcode] 61. 旋转链表
  • [leetcode]114. Flatten Binary Tree to Linked List由二叉树构建链表
  • [Linux] CE知识随笔含Ansible、防火墙、VIM、其他服务