2.3.2 JDK动态代理 -《SSM深入解析与项目实战》
时间:2022-07-23
本文章向大家介绍2.3.2 JDK动态代理 -《SSM深入解析与项目实战》,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
2.3.2 JDK动态代理
JDK动态代理是由Java内部使用反射机制来实现的。使用JDK动态代理必须是委托类实现统一的接口,否则JDK动态代理不能应用。虽然有一定的局限性,但是影响不大。java.lang.reflect包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。所以如果需要代理,我们代理类必须InvocationHandler 接口或者继承Proxy类。建议使用InvocationHandler 接口来进行实现代理类。
继续前面的支付场景,我们用JDK动态代理来实现。
首先定义一个支付接口和两个实现类,也就是我们的目标类。
实现类和接口
代码清单2-16:实现类和接口
/**
* 接口 支付的通用接口方法
*/
public interface Pay {
void pay(String operation);
}
/**
* 委托类 - 一种支付方式
*/
public class AliPay implements Pay {
@Override
public void pay(String operation) {
System.out.println("进行AliPay支付,操作:" + operation);
}
}
/**
* 委托类 - 另一种支付方式
*/
public class WxPay implements Pay {
@Override
public void pay(String operation) {
System.out.println("进行WxPay支付,操作:" + operation);
}
}
接下来是重点,也就是我们的代理类。
代码清单2-17:代理类PayProxy
/**
* JDK动态代理类
*/
public class PayProxy implements InvocationHandler {
private Object target;
/**
* 构造方法,需要实现代理的真实对象
* @param target
*/
public PayProxy(Object target) {
this.target = target;
}
/**
* 负责处理动态代理类上的方法调用
* 根据三个参数进行预处理或者分派到不同的委托类实例上使用反射进行执行
*
* @param proxy 被代理的对象
* @param method 要调用的方法
* @param args 方法调用时所需要的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在进行执行目标方法前可以进行操作
System.out.println("调用之前...");
System.out.println("Method:" + method);
//调用真实对象的方法,会跳转到代理对象关联的handler对象的invoke方法来进行调用,内部通过类反射实现
Object result = method.invoke(target, args);
//在进行执行目标方法后可以进行操作
System.out.println("调用之后...");
return result;
}
}
更多内容请阅读原文:
https://chenhx.blog.csdn.net/article/details/108011513
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 谷歌地球引擎(Google Earth Engine)之数据初探(栅格和矢量)
- Python-gdal离线文档下载
- 利用python把shp文件写入PostgresSQL数据库
- python调用cmd运行GDAL报错解决:ERROR 1: PROJ
- Tungsten Fabric知识库丨测试2000个vRouter节点部署
- 一行代码快速图像识别~一排代码搞定视频识别
- Python测试开发django5.urls.py参数name与<a>标签的引用
- Pytest配置文件pytest.ini
- 移植uc/OS-III最新版到小熊派开发板(STM32L431)
- phpStudy默认配置致Nginx解析漏洞复现
- HW|蓝队实战溯源反制手册分享
- 工具开发|Burp插件Unexpected_information
- 爱了!安利一个相见恨晚的可视化学习网站
- pandas+PyQt5轻松制作数据处理工具
- Python高效编程之88条军规(1):编码规范、字节序列与字符串