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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一人在外地钱花光了怎么办 银行卡被公安冻结卡里的钱怎么办 在店铺不上班了押工资了怎么办? 在银座的押金拿不出来怎么办 唯品会退货时快递单号填错了怎么办 天猫店铺快递已发到不了怎么办 中邮消费贷没审核通过怎么办 房贷扣款日忘存钱了怎么办 农业银行卡输密码次数超限载怎么办 农业银行卡丢了不知道卡号怎么办 银行卡短信扣费失败怎么恢复怎么办 歌华有线遥控器点了tvav怎么办 一级注册结构延续注册晚了怎么办 在京东买的黄金项链买贵了怎么办 京东上面买的商品不符合实际怎么办 在京东买东西卖家迟迟不发货怎么办 淘宝商家买的货一直不到怎么办 国美买的格力空调发票丢了怎么办 国美实体店发票丢了怎么办 我在苏宁买的冰箱发票丢了怎么办 信用卡家庭电单位电话换了怎么办 常住户囗和实际住址没房子怎么办 退货淘宝极速退款 卖家拒收怎么办 淘宝退货极速退款后卖家拒收怎么办 蘑菇街付款成功怎么申请退款怎么办 淘宝上拍错地址联系卖家不管怎么办 收到货想退款卖家不同意怎么办 小米小店复合通过qq群怎么办 买了火车票在订单上查不到怎么办 用支付宝付款扣款没成功怎么办 在京东买东西只收到空盒子怎么办 魅族移动数据是灰色的怎么办? 魅族手机账号密码忘记了怎么办视频 淘宝购物退货把单号写错了怎么办 天猫想退货商家不给退货地址怎么办 天天爱消除四星宠物等级已满怎么办 店不干了店里面的财神怎么办 微信显示登陆注册语言打不开怎么办 三星手机解锁以后突然不量怎么办 耐克、阿迪品牌鉴定买到假货怎么办 小米4c盒子不支持有线连接怎么办