码迷,mamicode.com
首页 > 编程语言 > 详细

黑马程序员--Java高新(10)_动态代理和AOP编程

时间:2014-09-20 08:53:37      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:动态代理

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 

一, 动态的核心

动态代理的两个核心,Proxy 和 InvocationHandler,都是Java.lang.reflect包下的接口类;由此也可以看出动态代理是反射的高级应用!

代理与反射的关系如何体现?从代理的建立过程的构建方法及其参数可见一斑:

1,代理最核心的Handler的唯一方法invoke()的核心参数Method method,是一个Class类型,并且在代理调用时,invoke到target对象来返回retval.

2,代理的构造方法参数, 也就是牛X的newProxyInstance()方法的前两个参数, 是目标接口的ClassLoader 和 Interface[ ],也是通过接口Class对象反射get到;

 

二, 代理的调用方法

Object invoke(Object proxy, Method method,Object[] args)  方法,该方法 在代理实例上处理方法调用并返回结果。

每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。

三个参数的意思是:

Object proxy           在其上调用方法的代理实例

Method method     对应于在代理实例上调用的接口方法的Method 实例

Object[] args         包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为null

 

三, 代理实例的创建

方法一.1,通过Proxy.getProxyClass()方法创建若干接口的Class文件,

            2,通过Class文件可以得到其构造方法

             3,最后通过构造方法实例的newInstance方法得到代理实例

 

方法二.,通过Proxy的newProxyInstance() 方法,直接返回一个带有代理类的指定调用处理程序的代理实例,

              它由指定的类加载器定义,并实现指定的接口             

                     该方法的参数列表是:

                     ClassLoader  loader,    指定一个类加载器用于加载指定的接口

                     Class<?>[] interfaces,   给出需要创建代理实例的接口

                      InvocationHandlerh,      给出代理实例的调用处理程序实现的接口

 

显而易见,方法二是对代理逻辑的代码重新封装,有利于编写和管理三大代理构建参数,使大家可以集中精力去处理invoke()方法, target对象,切面信息(Advice),实现AOP编程;

 

以下为Proxy实例的建立,和进一步AOP编程的应用:

  
static void clazzProxy()throws Exception{  
  
       ClassclazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader() ,Collection.class);  
  
       System.out.println(clazzProxy1.getName());  
  
        
  
       System.out.println("---------------constructorslist--------------");  
  
       Constructor[]constructors = clazzProxy1.getConstructors();  
  
       for(Constructorconstructor : constructors){  
  
              Stringname = constructor.getName();  
  
              StringBuildersBuilder = new StringBuilder(name);  
  
              sBuilder.append('(');  
  
              Class[]clazzParams = constructor.getParameterTypes();  
  
              for(ClassclazzParam:clazzParams){  
  
                     sBuilder.append(clazzParam.getName()).append(',');  
  
              }  
  
              if(clazzParams.length==0)  
  
              sBuilder.deleteCharAt(sBuilder.length()-1);  
  
              sBuilder.append(')');  
  
              System.out.println(sBuilder);  
  
       }  
  
       System.out.println("-------------begincerate instance --------------");  
  
       Constructorconstructor = clazzProxy1.getConstructor(InvocationHandler.class);  
  
       classMyInvocationHandler1 implements InvocationHandler{  
  
   
  
              @Override  
  
              publicObject invoke(Object arg0, Method arg1, Object[] arg2)  
  
                            throwsThrowable {  
  
                     //TODO Auto-generated method stub   
  
                     returnnull;  
  
              }  
  
       };  
  
        
  
       Collectionproxy1 = (Collection)constructor.newInstance(new MyInvocationHandler1());  
  
       System.out.println("xxxxxxxxx"+proxy1.toString());//没有返回值的方法可以调用。有返回值的方法,可以调用   
  
       //proxy1.size();//不能调用,因为其没有指定目标   
  
       proxy1.clear();//可以调用   
  
        
  
       Collectionproxy2 = (Collection)constructor.newInstance(new InvocationHandler(){  
  
   
  
              ArrayListtarget = new ArrayList();  
  
              @Override  
  
              publicObject invoke(Object proxy, Method method, Object[] args)  
  
                            throwsThrowable {  
  
                     longbeginTime = System.currentTimeMillis();  
  
                     ObjectretVal = method.invoke(target,args);  
  
                     longendTime = System.currentTimeMillis();  
  
                     System.out.println(method.getName()+"运行时间"+(endTime-beginTime));  
  
                     returnretVal;  
  
              }  
  
               
  
       });  
  
       proxy2.add("zxx");  
  
       proxy2.add("Java01");  
  
       proxy2.add("Java");  
  
       proxy2.size();  
  
        
  
       Collectionproxy3 = (Collection)Proxy.newProxyInstance(  
  
                     Collection.class.getClassLoader(),  
  
                     newClass[]{Collection.class},  
  
                     newInvocationHandler(){  
  
                            ArrayListtarget = new ArrayList();  
  
                            @Override  
  
                            publicObject invoke(Object proxy, Method method, Object[] args)  
  
                                          throwsThrowable {  
  
                                   longbeginTime = System.currentTimeMillis();  
  
                                   ObjectretVal = method.invoke(target,args);  
  
                                   longendTime = System.currentTimeMillis();  
  
                                   System.out.println(method.getName()+"运行时间:"+(endTime-beginTime));  
  
                                   returnretVal;  
  
                            }  
  
                     }  
  
                     );  
  
       proxy3.add("Java01");  
  
       proxy3.add("Java02");  
  
       proxy3.add("Java03");  
  
       System.out.println(proxy3.size());  
  
}  
  
}  


 

黑马程序员--Java高新(10)_动态代理和AOP编程

标签:动态代理

原文地址:http://blog.csdn.net/marching21/article/details/39405037

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!