JDK 动态代理的简单理解
2024-08-27 08:43:05
动态代理
代理模式是 Java 中的常用设计模式,代理类通过调用被代理类的相关方法,提供预处理、过滤、事后处理等服务,动态代理及通过反射机制动态实现代理机制。JDK 中的 java.lang.reflect.Proxy 类可以用来实现动态代理。
首先,准备一个简单的接口和实现类
/**
* 接口 IHello.java
*/
public interface IHello {
void hello();
}
/**
* 实现类 Hello.java
*/
public class Hello implements IHello {
@Override
public void hello() {
System.out.println("我是Hello.");
}
}
通过 Proxy 实现动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import org.junit.Test; public class HelloTest {
@Test
public void testProxy() throws Exception {
final IHello hello = new Hello(); /*
* proxyHello : 代理主题角色,代理类的实例
* IHello : 抽象主题角色,代理类和被代理类都需要实现的接口,JDK中的动态代理必须针对接口
* hello : 真实主题角色,被代理类的实例
*/
IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
new Class[] { IHello.class }, new InvocationHandler() { /*
* @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 前置的业务逻辑操作
System.out.println("---开始"); // 调用被代理类的方法,传入参数args,得到返回
Object object = method.invoke(hello, args); // 后置的业务逻辑操作
System.out.println("---结束"); return object;
}
}); proxyHello.hello();
}
}
最新文章
- 获取文件的缩略图Thumbnail和通过 AQS - Advanced Query Syntax 搜索本地文件
- getParameterMap()的返回值为Map<;String, String[]>;,从其中取得请求参数转为Map<;String, String>;的方法如下:
- SpringMVC 表单复选框处理
- python学习笔记:Day02
- 如何去除My97 DatePicker控件上右键弹出官网的链接 - 如何debug混淆过的代码
- python click module for command line interface
- Java读取mat文件
- syslog-ng 学习心得与配置说明
- hdu 4107
- meclipse中project facet问题
- IIS 配置
- 一个非常标准的Java连接Oracle数据库的示例代码
- mysql 交叉表
- iOS中添加UITapGestureRecognizer手势识别后,UITableView的didSelectRowAtIndexPath失效
- 二:java语法基础:
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
- motan源码分析十一:部分特性
- 给Ubuntu安装KDE桌面 [转]
- 了解 Spring Boot AutoConfiguration
- Android事件分发传递回传机制详解
热门文章
- Lua程序设计(二)面向对象概念介绍
- [转]LaTex常用数学符号整理
- Java并发——线程同步Volatile与Synchronized详解
- mybatis一对多关联查询——(九)
- Linux下JDK到底应该安装在哪儿?
- 005_系统运维之SLA与SLO的关系
- mysql5.7执行sql语句报错:In aggregated query without GROUP BY, expression #1 of SELECT list contains nonagg
- LeetCode(21):合并两个有序链表
- Oracle-查询最近更新的前10条数据
- LINQ基本语句