设计模式(3)-动态代理-相关面试题

163 阅读3分钟

1、你能说一下反射和动态代理的关系吗?

动态代理是一种基于反射的机制,它能够动态创建一个实现了指定接口的代理类,并将方法调用到指定的处理器上,准备说是invoke方法。

动态代理 通常用于实现AOP面向切面编程 在不修改原有代码的情况下,为类添加额外的功能,日志记录 性能 统计之类的.AOP是一种编程范式,用于在不修改原始代码的情况下向现有应用程序添加新功能。这种编程方式将应用程序分成许多独立的部分,称为切面。这些切面可以在应用程序的不同位置进行编写和维护,从而提高了应用程序的可重用性和可维护性

动态代理的实现依赖于反射机制,反射机制可以在运行时动态获取类的信息,并动态创建代理类和代理对象。因此反射是动态代理的基础

反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

2、举个例子来说明一下动态代理的使用吗?

比如我设计一个房东行为接口,和实现房东行为接口的房东类。

创建房东对象,这个房东对象是目标对象,

房东行为接口类  代理对象 =    (房东行为接口类)Proxy.newProxyInstance(房东对象.getClass().getClassLoader(),房东对象.getClass().getInterfaces(),new InvocationHandler(){
   public Object invoke(代理对象,调用的方法,方法参数){
       //执行方法前
      Object result = 调用的方法.invoke(房东对象,方法参数)
       //执行方法后
      return result;
   }
 });
 
 代理对象.调用方法

3、动态代理的优缺点

优点:

动态代理能运行时动态创建对象,从而更加灵活,能在不修改远目标类代码情况,添加额外功能,比如日志记录,性能统计,事务管理。

还能实现AOP面向切面编程,提高了重用性和可维护性

缺点: 运行时检测并动态创建代理类和对象。性能低。动态代理只能代理接口,无法代理类,还是有一定的受限。

4、说一下动态代理和静态代理的区别吗?

静态代理是在编译时就已经确定代理对象和被代理对象的关系

动态代理是在运行时动态地创建代理对象。

静态代理需要手动编写代理类,而动态代理可以自动生成代理类。

静态代理只能代理一个类或接口,而动态代理可以代理多个类或接口。

5、面试官: 那你能说一下动态代理的实现原理吗?

动态代理的实现原理是基于 Java 的反射机制和动态生成字节码技术。

在运行时,动态代理会根据指定的接口或类,动态地生成一个代理类,并将方法的调用转发到指定的处理器上。

代理类的生成过程是通过字节码生成器来实现的,它可以根据指定的接口或类,动态地生成一个代理类的字节码,并将其加载到内存中。

代理类的字节码中包含了对被代理对象的引用,以及对代理方法的调用逻辑。

当我们调用代理对象的方法时,会自动调用代理类中的方法,并将方法的调用转发到指定的处理器上。