关闭

动态代理的学习总结

79人阅读 评论(0) 收藏 举报

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

    看完了张孝祥老师的基础加强篇,发觉后面的动态代理知识相对抽象一时还不能完全理解,所以查找了很多资料,在此整理一下自己的收获,总结对动态代理的理解。
     开篇还是拿张老师经典的例子买电脑来说明,正常情况下我们有两种方法可以买到电脑,要么找代理商,要么找总部,虽然总部的电脑会便宜,但算上路费可能就贵了,所以招代理应该是最划算的;显然代理类可以代替实际类大部分的功能,是客户端与目标对象之间的桥梁,甚至使一些目标对象不便完成的任务做的很完美,代理类可以使客户不具备访问目标对象的某些数据,提高安全性。
     java从jdk1.3开始引入动态代理类的概念,动态代理可以提高代码额可复用性,多不同的类需要实现相同的功能,不必在每个类里面都写上相同的代码,通过一个动态的代理类就会方便很多,提高编程效率,这样若是后期想改变代码也会很方便。代理模式是生成和目标类相同接口的代理类,用户通过使用代理类来封装某个实现类,动态代理中的代理类由java.lang.reflect.Proxy类在运行时由接口定义,采用java反射功能动态生成。与java.lang.reflect.InvocationHandler结合,加强现有类的实现,通过自定义Hander重写invoke方法实现InvocationHandler接口,该方法可以利用反射机制实现特定功能,自定义Hander实例化时,将实现类传入Hander对象
    
import java.lang.reflect.Method;

public interface Advice {
 public void beforMethod();
 public void endMethod(Method method);
}


public class Myadvice implements Advice {
 long startTime;
 public void beforMethod() {
  startTime=System.currentTimeMillis(); 
 }
 public void endMethod(Method method) {
        long endTime=System.currentTimeMillis();
        System.out.println(method.getName() + "方法运行时间:" + (endTime - startTime)+ "毫秒");
 }
}

public class ProxyDemo {
        public static void main(String[] args)throws Exception {
     final ArrayList target=new ArrayList();
            Collection col=(Collection)Proxy.newProxyInstance(
  target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler(){
      public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
    advice.beforMethod();
    System.out.println(Thread.currentThread());
    Thread.currentThread().sleep(100);
    Object retVal=method.invoke(target, args);
    advice.endMethod(method);
    return retVal;
     }});
  col.add("123");
  col.add("234");
  System.out.println(col.size());
 }
}
      以上的代码只体现了代理类的实现方式,目标类通过代理控制这个对象的访问,说白了就是在特定情况下让客户看不到目标类的一些类容和服务,同时代理类也可以提供额外的服务,比如买电脑,电脑厂家值提供电脑,而代理上也可以通过送鼠标垫的方式吸引客户。
      其实代理类的知识远不止如此,需要学的还有很多,继续努力!

----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3265次
    • 积分:123
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档