六、设计模式-6.2、代理模式
6.2、代理模式
6.2.1、什么是代理?为什么要用动态代理?
答:
在Java中,代理是一种设计模式,其目的是在不修改原始对象的情况下,通过创建一个中间代理对象来控制对原始对象的访问。
动态代理是一种特殊类型的代理,它不需要预先编写代理类,而是在运行时动态生成代理对象。Java中的动态代理是通过反射机制实现的。
使用动态代理的主要原因是在不改变原始对象的情况下,提供额外的功能或行为。比如,可以在方法执行前后进行日志记录、权限管理、事务处理等。此外,动态代理还可以实现远程代理,将方法调用转发到远程服务器上的对象。
动态代理的好处是可以在运行时动态地增加、删除和修改代理类的行为,使得代码更加灵活和可扩展。它也能够减少重复的代码和提高代码的可重用性。
6.2.2、JDK动态代理为什么只能代理有接口的类?
答:
有接口的类就是实现了接口的类,JDK动态代理只能代理有接口的类,是因为JDK动态代理是基于接口实现的。
JDK动态代理是通过创建一个实现代理接口的代理类,并通过反射调用被代理对象的方法。在代理类中,每个被代理的方法都会被重写,并在方法中调用InvocationHandler的invoke方法,实现了对被代理对象方法的增强。
由于Java是单继承的语言,一个类只能继承一个父类,但可以实现多个接口。因此,JDK动态代理选择通过创建代理接口的实现类来实现代理的功能。代理对象可以实现多个接口,通过实现这些接口来实现代理对象和被代理对象的方法一一对应。
而对于没有实现接口的类,JDK动态代理无法实现以接口为基础的代理机制,因为没有接口可以作为代理类的基础。针对没有实现接口的类,可以使用其他代理框架,如CGLib,来实现动态代理。CGLib可以通过动态生成字节码,直接继承被代理类,从而实现对非接口类的代理。