一、代理描述
在不修改源码的情况下,增强方法,在方法执行前后做任何你想做的事情。如:记录日志、权限控制等。
一旦某个实例被代理后,则应使用代理后的对象进行方法调用,而非被代理的对象。此时使用者应该忽略被代理的对象,只关注代理后的对象。
代理的方式有:静态代理、动态代理。
二、静态代理
代理对象的类是真实存在的,并非动态生成的。
代理对象持有被代理对象的引用,可以不实现任何接口。
代理对象中的方法通过被代理对象的引用调用被代理对象的方法,同时执行代理逻辑。
三、JDK动态代理使用方法
1、被代理对象实现某些接口(必要条件)。
2、编写InvocationHandler子类,实现invoke方法。
在invoke方法中通过反射机制调用被代理对象的业务方法,同时,在该方法中实现代理需要做的逻辑。
3、使用Proxy.newProxyInstance创建代理后的对象。
4、通过代理后的对象,调用业务方法。
四、动态代理解读
代理对象持有InvocationHandler的引用,每当通过代理对象调用业务方法时会调用InvocationHandler的invoke方法。
在InvocationHandler的invoke方法中通过反射机制调用被代理对象对应的业务方法,同时执行代理逻辑。
Invoke方法中第一个参数: Object proxy,该对象是代理后的对象。在invoke方法中使用该对象时需小心,防止出现java.lang.StackOverflowError异常。
JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
cglib的原理是对指定的目标类生成一个子类,并覆盖其中方法实现代理,但因为采用的是继承,所以不能对final修饰的类或方法进行代理。
五、动态代理解读
模拟Proxy.newProxyInstance创建的代理对象步骤(代码见附件Proxy.java):
1、 根据被代理对象的接口信息,通过Java反射机制动态生成代理类的字符串。该代理类也同样实现这些接口中的方法。
1.1、在方法的实现中调用InvocationHandler的invoke方法,将当前对象、方法信息、入参传递过去。
2、根据创建好的代理类字符串,创建Java文件。
3、编译该Java文件,生成代理类字节码。
4、通过被代理类的加载器,将编译好的代理类字节码加载类到内存。
5、创建代理对象的实例。
六、静态代理与动态代理区别
静态代理通常只代理一个类,动态代理可以代理任何接口的实现类。
静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。
静态代理在程序运行前代理类的.class文件就已经存在了,动态代理是程序运行时动态生成。
七、装饰设计模式
装饰设计模式是静态代理的特殊模式。静态代理中,代理对象和被代理对象实现同样的接口,这种设计模式为装饰设计模式。
装饰设计模式与代理设计模式对比:
1、装饰对象与被装饰对象都实现同样的接口,代理对象和被代理对象也同样需要实现同样的接口。
2、创建装饰对象时需调用有参构造函数,传入被装饰对象;创建代理对象时,在内部自行创建被代理对象。
3、主要区别还得从语义上区分。装饰起到方法增强效果,代理不仅起到方法增强效果,还起到权限控制效果。
4、装饰设计模式是静态代理的一种。
分享到:
相关推荐
Java设计模式是软件开发中的重要概念,它提供了一套通用的解决方案模板,使得代码更加可复用、可扩展。在这些模式中,代理模式(Proxy Pattern)是一种常用的结构型设计模式,它允许我们为一个对象创建一个代理,该...
总结来说,代理模式在Java中主要用于在调用实际对象时添加额外的功能,而静态代理、装饰者和动态代理则是三种不同的实现方式。静态代理简单直观,但需要手动编写代理类;装饰者模式更注重扩展对象功能;动态代理则...
3. **模式间的相互关系**:了解不同设计模式之间的关联和区别,比如装饰器和代理模式的区别,或者单例模式与静态内部类的实现差异。 4. **模式的优缺点**:评估每种模式的适用性和潜在问题,如过度设计或性能影响。 ...
在Java中,有静态代理和动态代理两种方式,动态代理通常基于Java的反射机制实现。 八、适配器模式(Adapter) 适配器模式作为两个不兼容接口之间的桥梁,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作...
5. **装饰器模式**:装饰器模式动态地给对象添加一些额外的职责,提供了一种用附加对象来扩展功能,而不是继承的方式来改变对象的结构。在代码中,你可能发现一个基础组件类`Component`,以及一些装饰类如`...
**JAVA设计模式** 在软件工程领域,设计模式是一种在特定情境下解决问题的可复用解决方案。它们是经验的总结,代表了在特定上下文中被广泛接受的、经过时间考验的最佳实践。Java设计模式是面向对象编程中的一种重要...
《深入浅出Java设计模式》是一本专注于Java编程领域中的设计模式专著,旨在帮助开发者深化对设计模式的理解,提高代码质量和可维护性。设计模式是软件开发中经过时间检验的解决方案,它们是解决常见问题的最佳实践。...
本资源"深入浅出设计模式C#Java版"是针对这两种主流编程语言介绍设计模式的经典著作,旨在帮助开发者理解和应用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在C#中,可以使用`密封`和`...
在Java中,静态代理和动态代理(JDK动态代理和CGLIB动态代理)都是实现代理模式的方式。 10. 策略模式:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用它的...
Java中可以通过静态代理或动态代理(JDK Proxy)来实现。 8. **桥接模式**:将抽象部分与它的实现部分分离,使它们都可以独立地变化。在Java中,它可以用于解耦抽象和实现,提高系统的灵活性。 9. **组合模式**:...
Java的23种设计模式是软件工程中非常重要的概念,它们是解决常见编程问题的成熟解决方案,被广泛应用于各种复杂的软件开发中。设计模式不是具体的代码或库,而是一种通用的、可重用的设计方案,它描述了在特定上下文...
此外,书中可能还会涵盖一些高级主题,如工厂方法(Factory Method)和抽象工厂(Abstract Factory)模式,它们提供了一种创建对象家族的方式,以及代理模式的静态代理和动态代理(JDK Proxy或CGLIB)。还有可能是...
本教程“Java版设计模式教程”专注于使用Java语言实现这些设计模式,帮助开发者深入理解面向对象编程中的最佳实践。 首先,我们来了解一下什么是面向对象编程(OOP)。面向对象编程是一种编程范式,它将现实世界的...
在Java编程中,设计模式是一种解决常见软件设计问题的经验总结,是经过实践验证的最佳实践。Java语言的面向对象特性使其成为实现设计模式的理想平台。书中涉及的源代码,将帮助读者将理论知识转化为实际操作,更好地...
12. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问,如Java中的静态代理和动态代理。 13. **责任链模式**:避免请求的发送者和接收者之间的耦合,将多个处理者链接在一起,形成一条链,请求沿着链...
Java中可以通过静态代理或动态代理(JDK Proxy)实现。 5. **装饰器模式**:动态地给对象添加一些额外的职责,可以扩展功能而不影响原有类的结构。Java的IO流体系就广泛应用了装饰器模式。 6. **观察者模式**...
Java设计模式是软件工程中的一种最佳实践,它提供了一种在特定情况下解决设计问题的通用模板。本课件集合了多种常见的设计模式,通过PPT形式深入浅出地进行了详尽讲解,旨在帮助开发者提高代码的可重用性、可读性...
### 常用设计模式及Java程序设计 #### 设计模式概述 设计模式是一种软件设计领域中的通用解决方案,用于描述解决常见设计问题的最佳实践。它不仅有助于提高代码的复用性和可读性,还能增强软件架构的灵活性和扩展...