黑马程序员-动态代理

---------------------- android培训java培训、期待与您交流! -------------------------------


1,摘要


       Java动态代理是java的一个重要的概念.虽然其默默无闻,不被初学者所熟知,但其如同Java反射机制一样,使java丰富多彩.


       首先,为什么我们需要java的动态代理呢.java的代理有两种,分别是静态代理和动态代理,静态代理不是很实用,这里也就不
       详细的说了.说到动态代理,我们对’动态’一定感到很亲切,不错,在前面已经讨论了Java的反射机制,那么它和java反射机制
       有什么联系呢.java动态代理正是依靠java反射机制提供的动态能力.如此,我们不妨假想一下:我们需要动态的运行一个类
       中的方法,但这个方法在运行之前和运行之后可能需要一些辅助动作,比如,该方法运行之前需要一些数据的准备等等.那么这
       时动态代理就派上大的用场了.


2,机制分析


        既然称之为动态,那么其是在jvm运行过程中执行的;同时,代理就说明我们不能直接调用执行这个动作,而要通过一个中间事
件来间接的执行这个动作.Java动态代理是自jdk1.3引入的,位于java.lang.reflect.Proxy包下.其主要涉及到了Proxy类和
InvocationHandler接口。通过jdk查看,我们发现Proxy类和InvocationHandler接口都不是很复杂,Proxy类有4个静态方法,
其中的public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws
IllegalArgumentException方法是动态代理重要的方法;InvocationHandler接口只有一个方法,而这个方法则是动态代理的核心。Proxy
类主要用来获取代理类的对象实例,InvocationHandler接口则主要完成了代理的过程。


        下面将通过代码来解释动态代理的过程。


package proxy;


 


/**


 * real class interface


 * 一个普通的接口,里面有两个方法。


 */


publicinterface IUserProxy {


   publicvoid save(String name,String password);


   publicvoid remove(String name);


}






package proxy;


 


/**


 * 该接口的一个实现。


 *


 */


publicclass UserProxyImpl implements IUserProxy{


  


   publicvoid save(String name, String password) {


      System.out.println("hello,"+name+",your info saved");


   }


   publicvoid remove(String name) {


      System.out.println("hello,"+name+",your info removed");


   }


  


}




package proxy;


 


import java.lang.reflect.InvocationHandler;


import java.lang.reflect.Method;


 


/**


 * 动态代理类,注意该类实现了InvocationHandler接口,这是动态代理类必须实现的接口。


 *


 */


public class UserProxy implements InvocationHandler{


       


        private Object proxy;


        //通过代理类的构造函数,将委托类的对象传进来


        public UserProxy(Object proxy){


                this.proxy = proxy;


        }


        //实现了InvocationHandler接口的唯一的方法。


        public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {


                //在执行委托类方法前,可以执行一些其他的动作。


                System.out.println("the method name is:"+method.getName());


                //执行委托类的方法,


                method.invoke(this.proxy, args);


                //在执行委托类方法后,可以执行一些动作。


                System.out.println("the method invoked");


                return null;


        }


}








package proxy;


 


import java.lang.reflect.Proxy;


/**


 *测试动态代理


 *


 */


publicclass TestProxy {


  


   publicstaticvoid main(String[] args){


      IUserProxy user = new UserProxyImpl();


      UserProxy proxy = new UserProxy(user);


      //获取一个代理,其中用到了java反射机制


      IUserProxy userproxy = (IUserProxy)Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), proxy);


       //执行该方法其实是执行了UserProxy类中的public Object invoke(Object proxy, Method method, Object[] args)throws Throwable方法。


      userproxy.save("test", "12345");


      userproxy.remove("test");


   }


}


------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值