【面试问题】动态代理是什么?

简介: 【1月更文挑战第27天】【面试问题】动态代理是什么?

动态代理(Dynamic Proxy)是一种在运行时生成代理对象的机制,该代理对象可以在运行时动态地处理被代理对象的方法调用。与静态代理相比,动态代理无需提前为每个被代理的类编写一个专门的代理类,而是在运行时动态生成代理对象,使得代理的过程更加灵活和通用。

在 Java 中,动态代理主要通过 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口实现。以下是动态代理的关键组成部分:

  1. InvocationHandler 接口:InvocationHandler 接口是动态代理的核心。它只定义了一个方法 invoke,该方法在代理对象调用方法时被调用。invoke 方法接收三个参数:
  • Object proxy:代理对象。
  • Method method:被代理的方法。
  • Object[] args:方法的参数。
  1. invoke 方法的实现确定了在调用代理对象的方法时要执行的逻辑,包括是否调用被代理对象的方法、在方法调用前后执行其他逻辑等。
  2. Proxy 类:Proxy 类是用于创建动态代理对象的工具类。它提供了静态方法 newProxyInstance,用于在运行时创建代理对象。newProxyInstance 方法接收三个参数:
  • ClassLoader loader:类加载器,用于加载生成的代理类。
  • Class<?>[] interfaces:被代理对象实现的接口。
  • InvocationHandler h:实现了 InvocationHandler 接口的对象,即代理对象在方法调用时执行的逻辑。
  1. newProxyInstance 方法返回一个实现了指定接口的代理对象。
  2. 示例:下面是一个简单的动态代理示例,假设有一个接口 Subject 和其实现类 RealSubject
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
importjava.lang.reflect.Proxy;
interfaceSubject {
voidrequest();
}
classRealSubjectimplementsSubject {
publicvoidrequest() {
System.out.println("RealSubject: Handling request.");
    }
}
classDynamicProxyHandlerimplementsInvocationHandler {
privateObjectrealSubject;
publicDynamicProxyHandler(ObjectrealSubject) {
this.realSubject=realSubject;
    }
publicObjectinvoke(Objectproxy, Methodmethod, Object[] args) throwsThrowable {
System.out.println("Dynamic Proxy: Before invoking method.");
Objectresult=method.invoke(realSubject, args);
System.out.println("Dynamic Proxy: After invoking method.");
returnresult;
    }
}
publicclassDynamicProxyExample {
publicstaticvoidmain(String[] args) {
RealSubjectrealSubject=newRealSubject();
InvocationHandlerdynamicProxyHandler=newDynamicProxyHandler(realSubject);
SubjectproxySubject= (Subject) Proxy.newProxyInstance(
Subject.class.getClassLoader(),
newClass[]{Subject.class},
dynamicProxyHandler        );
proxySubject.request();
    }
}

在上述示例中,DynamicProxyHandler 类实现了 InvocationHandler 接口,定义了在代理对象方法调用前后执行的逻辑。然后,通过 Proxy.newProxyInstance 方法创建了一个实现了 Subject 接口的动态代理对象,该代理对象在调用 request 方法时会执行 DynamicProxyHandler 中定义的逻辑。

动态代理的优势在于它的通用性,能够代理任何实现了接口的类,并且无需生成特定的代理类文件。这种机制在很多框架和库中得到了广泛应用,例如在 AOP(面向切面编程)中,动态代理可以用于在方法调用前后执行额外的逻辑。

相关文章
SpringJDK动态代理实现,2024Java面试真题精选干货整理
SpringJDK动态代理实现,2024Java面试真题精选干货整理
|
6天前
|
Java 数据安全/隐私保护
【面试问题】JDK 动态代理与 CGLIB 区别?
【1月更文挑战第27天】【面试问题】JDK 动态代理与 CGLIB 区别?
|
7月前
|
监控 Java Spring
【面试题精讲】JDK动态代理
【面试题精讲】JDK动态代理
|
9月前
|
负载均衡 Java
面试官,谈谈动态代理与RPC?我...
面试官,谈谈动态代理与RPC?我...
87 0
|
Java
Java 最常见的面试题:怎么实现动态代理?
Java 最常见的面试题:怎么实现动态代理?
121 0
|
Java Spring
Java 最常见的面试题:动态代理是什么?有哪些应用?
Java 最常见的面试题:动态代理是什么?有哪些应用?
136 0
|
设计模式 安全 Java
面试篇之什么是静态代理?什么是动态代理?
Java中的代理,开源理解为通过代理去访问实际的目标对象,比如呢?我们平常买卖二手车的中间商,就可以看作一个代理类,不过你也可以直接去和二手车的主人买卖。
106 0
|
Java
面试官:你说你懂动态代理,那你知道为什么JDK中的代理类都要继承Proxy吗?
之前我已经写过了关于动态代理的两篇文章,本来以为这块应该没啥问题,没想到今天又被难住了… 太难了!!! 之前文章的链接: 1,动态代理学习(一)自己动手模拟JDK动态代理、 2.动态代理学习(二)JDK动态代理源码分析
162 0
|
设计模式 Java 索引
动态代理总结,面试你要知道的都在这里,无废话!
代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能一个比方:在租房的时候,有的人会通过房东直租,有的人会通过中介租房。这两种情况哪种比较方便呢?当然是通过中介更加方便。这里的中介就相当于代理,用户通过中介完成租房的一系列操作(看房、交押金、租房、清扫卫生)代理模式可以有效的将具体的实现与调用方进行解耦,通过面向接口进行编码完全将具体的实现隐藏在内部。创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理
面试官问我:什么是静态代理?什么是动态代理?注解、反射你会吗?
欢迎关注同名公众号《Java鱼仔》,更多知识点你值得拥有 开场 一位穿着蓝色衬衫,牛仔裤,拿着一个白色保温杯的中年男子急匆匆地坐在你对面,看样子是项目上的东西很急,估摸面试时间不会太长,这样一想心情放松了许多......(后来我就被打脸了)
面试官问我:什么是静态代理?什么是动态代理?注解、反射你会吗?