动态代理
来源:互联网 发布:冰川网络官网 编辑:程序博客网 时间:2024/06/04 19:48
注:本文为阅读《疯狂Java讲义》第3版(李刚)一书后的学习笔记, 特此说明。
(关于动态代理 及 AOP的知识点,在这本书中都讲得挺好的,可以参考原书P842-848)
使用Proxy和InvocationHandler创建动态代理
在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类或动态代理对象。
Proxy提供了用于创建动态代理类和动态代理对象的静态方法,它也是所有动态代理类的父类。如果需要在程序中为一个或多个接口动态地生成实现类,就可以使用Proxy来创建动态代理类;如果需要为一个或多个接口动态地创建实例,也可以使用Proxy来创建动态代理实例。
实际上,即使采用第一个方法生成动态代理类之后,如果程序需要通过该代理类来创建对象,依然需要传入一个InvocationHandler对象。也就是说,系统生成的每个代理对象都有一个与之关联的InvocationHandler对象。
在定义InvocationHandler的实现类时,需要重写invoke()方法,调用代理对象的所有方法时,都会被替换成调用该invoke()方法。
示例(该例子来自《疯狂Java讲义》):
interface Person{ void walk(); void sayHello(String name);}class MyInvokationHandler implements InvocationHandler{ /* 执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法 其中: proxy:代表动态代理对象 method:代表正在执行的方法 args:代表调用目标方法时传入的实参。 */ public Object invoke(Object proxy, Method method, Object[] args) { System.out.println("----正在执行的方法:" + method); if (args != null) { System.out.println("下面是执行该方法时传入的实参为:"); for (Object val : args) { System.out.println(val); } } else { System.out.println("调用该方法没有实参!"); } return null; }}public class ProxyTest{ public static void main(String[] args) throws Exception { // 创建一个InvocationHandler对象 InvocationHandler handler = new MyInvokationHandler(); // 使用指定的InvocationHandler来生成一个动态代理对象 Person p = (Person)Proxy.newProxyInstance(Person.class.getClassLoader() , new Class[]{Person.class}, handler); // 调用动态代理对象的walk()和sayHello()方法 p.walk(); p.sayHello("孙悟空"); }}
运行结果:
0 0
- 代理-->静态代理&动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- Android 获取世界时区
- Windows下配置环境变量和需不需要重启问题
- 1441 士兵的数字游戏 51nod
- Leetcode8 Two sum
- 使用session实现登录判断功能
- 动态代理
- Python collections 拾遗
- 《嫌疑人X的献身》读后感
- 4.2 在线广告中的受众定向 刘鹏-计算广告读书笔记
- 设计模式之解释器模式
- AlertDialog editview不能弹出输入法
- JAVA实现hash表的基本操作
- 机器学习实战之FP-growth
- 【LeetCode】之字形变换