JDK动态代理
来源:互联网 发布:vmware14安装ubuntu 编辑:程序博客网 时间:2024/06/16 21:10
借助于Java提供的Proxy和InvocationHandler,可以实现在运行时生成动态代理的功能,而动态代理对象可作为目标对象使用,而且增加了目标对象的功能。下面我们将要实现一个类似于JDK的动态代理。设计的UML类图如下。
下面笔者给出的实现方法。
1) 提供一个Dog接口。
public interface Dog{// info()方法声明void info();// run()方法声明void run();}
2) GunDog的类。
public class GunDog implements Dog{//info方法实现,仅仅打印一个字符串public void info(){System.out.println("我是一只猎狗");}//run方法实现,仅仅打印一个字符串public void run(){System.out.println("我奔跑迅速");}}
3) 下面提供一个TxUtil类,这个类通常称为拦截器,该类包含两个方法,分别是开始事务和提交事务。
public class TxUtil{// 第一个拦截器方法:模拟事务开始public void beginTx(){System.out.println("=====模拟开始事务=====");}// 第二个拦截器方法:模拟事务结束public void endTx(){System.out.println("=====模拟结束事务=====");}}
4) JDK动态代理的关键在于下面的MyInvokationHandler类,该类是一个InvocationHandler实现类,该实现类的invoke方法将会作为代理对象的方法实现。
public class MyInvokationHandlerimplements InvocationHandler{// 需要被代理的对象private Object target;public void setTarget(Object target){this.target = target;}// 执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法public Object invoke(Object proxy, Method method, Object[] args)throws Exception{TxUtil tx = new TxUtil();// 执行TxUtil对象中的beginTx()。tx.beginTx();// 以target作为主调来执行method方法Object result = method.invoke(target , args);// 执行TxUtil对象中的endTx()。tx.endTx();return result;}}
5) 下面再为程序提供一个MyProxyFactory类,该对象专门为指定的target生成动态代理实例。
public class MyProxyFactory{// 为指定target生成动态代理对象public static Object getProxy(Object target)throws Exception{// 创建一个MyInvokationHandler对象MyInvokationHandler handler = new MyInvokationHandler();// 为MyInvokationHandler设置target对象handler.setTarget(target);// 创建并返回一个动态代理return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);}}
6) 写个测试类。
public class Test{public static void main(String[] args)throws Exception{// 创建一个原始的GunDog对象,作为targetDog target = new GunDog();// 以指定的target来创建动态代理Dog dog = (Dog)MyProxyFactory.getProxy(target);// 调用代理对象的info()和run()方法dog.info();dog.run();}}
7) 执行结果。
8) 执行步骤。
i. 创建TxUtil实例。
ii. 执行TxUtil实例的beginTx()方法。
iii. 使用反射以target作为调用执行info()方法。
iv. 执行TxUtil实例的endTx()方法。
0 0
- 代理模式,JDK动态代理
- Java动态代理--jdk代理
- 代理模式-JDK动态代理
- JDK中的动态代理
- JDK动态代理
- JDK动态代理
- JDK动态代理
- jdk动态代理(暂)
- JDK动态代理
- JDK动态代理实例
- jdk 动态代理
- JDK动态代理
- JDK动态代理说明
- jdk动态代理
- JDKDynamicProxy JDK动态代理
- JDK动态代理实现
- JDK 动态代理
- JDK动态代理
- jdbc批量插入实现大批量数据快速插入
- Win8 Tomcat安装及环境变量配置
- c++中的常量折叠 http://blog.csdn.net/yafeng_jiang/article/details/7101964
- 带你一步步实现线程池异步回调
- 你真的看懂R中的stem函数了吗?
- JDK动态代理
- ibatis源码学习(一)整体设计和核心流程
- EventBus使用详解
- Scala学习笔记--第1章 Scala基础
- 几种数据库的大数据批量插入
- 数据库面试常问的一些基本概念
- ROS配置ASUS Xtion
- JVM学习笔记(二)之内存管理
- ibatis源码学习(二)初始化和配置文件解析