网站首页 > java教程 正文
可以与之前的一篇文章结合阅读Java代理模式学习
本文主要以梳理代理模式为主要目标。
客户端通过代理对象间接访问目标对象,对客户端来说,目标对象是隐藏的,目的让代理模式起到对目标对象的保护作用。
首先要划分清楚代理模式的常用实现分类,分别是静态代理、动态代理、cglib。
然后什么情况下使用静态代理模式呢?
- 权限控制,比如目标对象有很多非常棒的功能,但是它想把这些功能划分权限,提供给不同的调用者使用,就可以新加一个代理对象,在代理对象中实现不同功能权限的调用
- 扩展功能,代理对象还可以在自身类中添加新的功能对目标对象进行功能的扩展
- 隐藏某个类,使用代理对象代替目标对象进行功能调用
静态代理
- 代理类和委托类实现同一接口
- 在委托类中实现功能,在代理类中的方法中引用委托类的方法
- 运行时,直接调用代理类的方法,间接调用委托类的功能方法
UML类图如下:
类与类之间的连接线,先说明一下:
虚线+空心三角:表示实现指向的接口类
实线+空心棱形:表示代理类聚合委托类,也就是代理类把委托类作为成员变量引用
动态代理
使用Java提供的InvocationHandler接口来实现
- 代理类实现Java提供的InvocationHandler接口,重写public Object invoke(Object obj, Method method, Object[] args)方法
invoke方法参数说明:
第一个参数Object:指的是代理类对象
第二个参数Method:指的是正在执行的委托类方法
第三个参数Object[]:指的是正在执行的委托类方法的多个参数数组
主要实现代码:
public class JdkProxy implements InvocationHandler {
private 接口对象;
public 接口对象 getInstance(接口对象) {
this.接口对象 = 接口对象;
Class<?> class = 接口对象.getClass();
return (接口对象)Proxy.newProxyInstance(class.getClassLoader(), class.getInterfaces(), this);
}
@override
public Object invoke(Object obj, Method method, Object[] args) {
return method.invoke(this.接口对象, args);
}
}
public static void main(String[] args) {
JdkProxy jdkProxy = new JdkProxy();
接口对象 = jdkProxy.getInstance(new 目标对象);
//下一步,就可以通过代理对象jdkProxy.getInstance方法得到的接口对象调用目标对象的方法了
}
cglib篇幅很长,再下一篇文章中写[奸笑],敬请期待...
- 上一篇: Java设计模式:代理模式,干货总结
- 下一篇: 姐姐带我玩转java设计模式(内附照片)- 代理模式
猜你喜欢
- 2024-10-24 Java动态代理与静态代理以及它能为我们做什么
- 2024-10-24 Java 设计模式 之 代理模式 (1)(java设计模式之代理模式)
- 2024-10-24 Java设计模式:代理模式 vs. 装饰模式
- 2024-10-24 设计模式篇——代理模式详解(面试再问你代理模式,这么回答他)
- 2024-10-24 动态代理大揭秘,带你彻底弄清楚动态代理
- 2024-10-24 面试:Java的代理模式动态代理和静态代理区别,aop用的什么代理
- 2024-10-24 Java设计模式之代理模式(java代理类是什么)
- 2024-10-24 JAVA设计模式——代理模式(java编写代理服务)
- 2024-10-24 23种java设计模式之:门面模式、享元模式、代理模式
- 2024-10-24 Java 17中的动态代理:实现灵活的代理模式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)