动态代理

代理模式是 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();
}
}

最新文章

  1. 获取文件的缩略图Thumbnail和通过 AQS - Advanced Query Syntax 搜索本地文件
  2. getParameterMap()的返回值为Map<String, String[]>,从其中取得请求参数转为Map<String, String>的方法如下:
  3. SpringMVC 表单复选框处理
  4. python学习笔记:Day02
  5. 如何去除My97 DatePicker控件上右键弹出官网的链接 - 如何debug混淆过的代码
  6. python click module for command line interface
  7. Java读取mat文件
  8. syslog-ng 学习心得与配置说明
  9. hdu 4107
  10. meclipse中project facet问题
  11. IIS 配置
  12. 一个非常标准的Java连接Oracle数据库的示例代码
  13. mysql 交叉表
  14. iOS中添加UITapGestureRecognizer手势识别后,UITableView的didSelectRowAtIndexPath失效
  15. 二:java语法基础:
  16. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
  17. motan源码分析十一:部分特性
  18. 给Ubuntu安装KDE桌面 [转]
  19. 了解 Spring Boot AutoConfiguration
  20. Android事件分发传递回传机制详解

热门文章

  1. Lua程序设计(二)面向对象概念介绍
  2. [转]LaTex常用数学符号整理
  3. Java并发——线程同步Volatile与Synchronized详解
  4. mybatis一对多关联查询——(九)
  5. Linux下JDK到底应该安装在哪儿?
  6. 005_系统运维之SLA与SLO的关系
  7. mysql5.7执行sql语句报错:In aggregated query without GROUP BY, expression #1 of SELECT list contains nonagg
  8. LeetCode(21):合并两个有序链表
  9. Oracle-查询最近更新的前10条数据
  10. LINQ基本语句