spring源码学习之【准备】jdk动态代理例子-阿里云开发者社区

开发者社区> 无信不立> 正文

spring源码学习之【准备】jdk动态代理例子

简介: 一:被代理的对象所要实现的接口 1 package com.yeepay.testpoxy; 2 3 import java.util.Map; 4 5 /** 6 * 被动态代理的接口 7 * @author shangxiaofei 8 * 9...
+关注继续查看

一:被代理的对象所要实现的接口

 1 package com.yeepay.testpoxy;
 2 
 3 import java.util.Map;
 4 
 5 /**
 6  * 被动态代理的接口
 7  * @author shangxiaofei
 8  *
 9  */
10 public interface MyCheckPay {
11     /**
12      * 付钱的接口
13      * @param name
14      * @param money
15      * @return
16      */
17     public Map<String, String> payMoney(String name,Integer money);
18 }
View Code

二:被动态代理的实现类

 1 package com.yeepay.testpoxy;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 /**
 7  * 被动态代理的实现类
 8  * @author shangxiaofei
 9  *
10  */
11 public class ShangxiaofeiMyCheckPay implements MyCheckPay{
12 
13     @Override
14     public Map<String, String> payMoney(String name, Integer money) {
15         System.out.println("ShangxiaofeiMyCheckPay.payMoney()========>name=["+name+"],payMoney=["+money+"]");
16         Map<String, String> map=new HashMap<String, String>();
17         map.put("result",name+"付钱"+money+"元,已经结束");
18         return map;
19     }
20 
21     
22     
23 }
View Code

三:动态代理的增强类(代理类)

 1 package com.yeepay.testpoxy;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 
 6 /**
 7  * 增加功能的类
 8  * @author shangxiaofei
 9  *
10  */
11 public class HandlerForMyCheckPay implements InvocationHandler{
12     /**
13      * 被委托的类的引用
14      */
15     private Object object;
16 
17     
18     
19     /**
20      * 空构造
21      */
22     public HandlerForMyCheckPay() {
23     
24     }
25 
26 
27 
28     /**
29      * 有参构造
30      * @param object
31      */
32     public HandlerForMyCheckPay(Object object) {
33         this.object = object;
34     }
35 
36 
37 
38 
39     /**
40      * Object proxy:指代我们所代理的那个真实对象,这个对象不能使用,否则会引起栈溢出
41      * Method method: 指代的是我们所要调用真实对象的某个方法的Method对象
42      * Object[] args: 指代的是调用真实对象某个方法时接受的参数
43      */
44     @Override
45     public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
46         
47         /**
48          * 被代理对象调用方法之前调用(aop的前置增强)
49          */
50         System.out.println("HandlerForMyCheckPay.invoke()=======>【付钱前】向统计系统发送付钱消息");
51         if(args!=null&&args.length>0){
52             for(int i=0;i<args.length;i++){
53                 System.out.println("HandlerForMyCheckPay.invoke()发送消息为===>"+args[i]);
54             }
55         }
56         
57         
58         /**
59          * 调用被代理对象的实际的方法
60          */
61         Object d=method.invoke(this.object, args);
62     
63         
64         /**
65          * 调用被代理对象的实际的方法之后执行:后置增强
66          */
67         System.out.println("HandlerForMyCheckPay.invoke()=======>【付钱后】进行计算执行时长");
68         
69         return d;
70     }
71     
72     
73 
74 }
View Code

四:代理类的生产工厂

 1 package com.yeepay.testpoxy;
 2 
 3 import java.lang.reflect.Proxy;
 4 
 5 /**
 6  * 生产代理者的工厂类
 7  * @author shangxiaofei
 8  *
 9  */
10 public class ProxyFactory {
11 
12     public static MyCheckPay getMyCheckPay(){
13         
14         /**
15          * ClassLoader loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
16          * Class<?>[] interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
17          * InvocationHandler h:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
18          */
19         Object object=Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(), new Class[]{MyCheckPay.class},new HandlerForMyCheckPay(new ShangxiaofeiMyCheckPay()));
20         return (MyCheckPay) object;
21     }
22     
23     
24     public static MyCheckPay getMyCheckPay2(){
25         
26         /**
27          * ClassLoader loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
28          * Class<?>[] interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
29          * InvocationHandler h:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
30          */
31         Object object=Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(),MyCheckPay.class.getInterfaces(),new HandlerForMyCheckPay(new ShangxiaofeiMyCheckPay()));
32         return (MyCheckPay) object;
33     }
34 }
View Code

五:测试类

 1 package com.yeepay.testpoxy;
 2 
 3 import java.util.Map;
 4 
 5 /**
 6  * 测试动态代理
 7  * @author shangxiaofei
 8  *
 9  */
10 public class TestController {
11 
12     private MyCheckPay myCheckPay=ProxyFactory.getMyCheckPay();
13     
14     public void payMoney(String name,Integer money){
15         System.out.println("TestController.payMoney(开始)");
16         Map<String, String> map=myCheckPay.payMoney(name, money);
17         System.out.println("TestController.payMoney(结束)"+map.get("result"));
18     }
19     
20     /**
21      * TestController.payMoney(开始)
22      *HandlerForMyCheckPay.invoke()=======>【付钱前】向统计系统发送付钱消息
23      *HandlerForMyCheckPay.invoke()发送消息为===>怪物雷克
24      *HandlerForMyCheckPay.invoke()发送消息为===>100
25      *ShangxiaofeiMyCheckPay.payMoney()========>name=[怪物雷克],payMoney=[100]
26      *HandlerForMyCheckPay.invoke()=======>【付钱后】进行计算执行时长
27      *TestController.payMoney(结束)怪物雷克付钱100元,已经结束
28      * @param args
29      */
30     public static void main(String[] args) {
31         TestController testController=new TestController();
32         testController.payMoney("怪物雷克", 100);    
33     }
34     
35 }
View Code

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
客户端自动升级的一个代码例子【C/S】
经常看到有问客户端自动更新问题,把一个以前看到的常用的方法整理了一下,放在网上供大家使用。 详细代码下载地址 http://cid-56b433ad3d1871e3.office.live.com/self.
590 0
Android JAVA 语言基础例子代码
Android的界面一般都是java开发的,因此对于c++,.net人员来说理解和编写有一个适应过程,最近参考了一下资料,把这些涉的一些java基础使用以例子代码的形式总结起来,记录了这个平台的熟悉过程。
853 0
LinkedHashMap源码分析(基于JDK1.6)
LinkedHashMap类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点;而在迭代访问时反而更快,因为它使用链表维护内部次序(HashMap是基于散列表实现的,相关HashMap的内容可以看《Java集合类》和《HashMap源码分析》)。
582 0
自己在linux上编译、链接、动态库和静态库的学习笔记
在平常的项目中,我们都是使用公司要求的makefile、makedebug一类的文件,因此,在编译、链接、生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改、添加一些文件名,或许这次我们编译通过了,但是,在某一个时候,可能出现了一个问题,无论简单与否,因为平常没有留意,导致的结果可能是花了好长时间才能解决。
871 0
TreeMap源码分析——基础分析(基于JDK1.6)
常见的数据结构有数组、链表,还有一种结构也很常见,那就是树。前面介绍的集合类有基于数组的ArrayList,有基于链表的LinkedList,还有链表和数组结合的HashMap,今天介绍基于树的TreeMap。
403 0
HashSet及LinkedHashSet源码分析(基于JDK1.6)
Java容器类的用途是“保存对象”,分为两类:Map——存储“键值对”组成的对象;Collection——存储独立元素。Collection又可以分为List和Set两大块。List保持元素的顺序,而Set不能有重复的元素。
718 0
+关注
无信不立
人无信不立,业不勤不精
595
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载