课程咨询 :18357109557 QQ:3163902815

杭州java培训

杭州java培训 > 达内新闻 > 达内:java的代理模式简介
  • 达内:java的代理模式简介

    发布:杭州java培训      来源:PHPERZ      时间:2015-12-17


  •     杭州达内Java培训专家讲解Java的代理模式,分为静态代理和动态代理。

        代理的字面意思是”代人理事“,也就是说当实现某个操作的时候发现根本不能使用相关的对象或者使用这个对象的效果不好的时候,就建立代理对象,让代理对象去完成任务。

        1、静态代理:

        我们的代理对象是手动创建的,代理对象内部是有一个被代理对象对应的类的对象的,所以如果想要执行某些被代理对象的方法时就可以使用这个新建的代理对象的同名方法去执行,这个时候执行的逻辑里面其实就可以用这个内部对象的同名方法。

    interface Subject{
            public void operate();
    }

    class SubjectImpl implements Subject{
            @Override
            public void operate() {
                  System. out.println( "real operate");
           }
    }

    class SubjProxy implements Subject{
           SubjectImpl subjectImpl = new SubjectImpl();
            @Override
            public void operate() {
                  System. out.println( "proxy starts");
                   subjectImpl.operate();
           }
    }

    public class TestClass {
            public static void main(String[] args) {
                  SubjProxy proxy = new SubjProxy();
                  proxy.operate();
           }
    }

        由此,我们可以看出来新建的代理对象拥有和原对象相同的接口,所以可以像操作原对象一样地去操作代理对象,代理对象的方法还可以做出拓展,做到原对象做不了的事情 。

        2、动态代理:

        我们如果的就是原对象的类结构,然后通过重写这个类结构中的相关方法去直接完成任务,在java中,我们完全可以通过反射去解决这个问题,完全不需要再去在代理对象内部搞一个原对象类型的对象出来。

    interface Subject{
            public void operate();
    }

    class SubjectImpl implements Subject{
            @Override
            public void operate() {
                  System. out.println( "real operate");
           }
    }

    public class TestClass {
            public static void main(String[] args) {
                  Subject subject = (Subject)Proxy.newProxyInstance(SubjectImpl. class.getClassLoader(), SubjectImpl.class.getInterfaces(), new InvocationHandler() {
                          @Override
                          public Object invoke(Object proxy, Method method, Object[] args)
                                       throws Throwable {
                                      System. out.println( "Proxy operate");
                                return null;
                         }
                  });
                  subject.operate();
           }
    }

        动态代理的方式其实是反射的一种体现,为了让最后的代理对象能够真的去执行被代理的对象才能完成的任务,代理对象必须要得到被代理对象的类的结构,这样就能获取到被代理对象的方法,截获这个方法后可以使得方法重定向到代理对象的invoke方法上执行被重写的代理方法。

        所以新建代理对象实例的时候要将被代理类的类加载器、类实现的接口和重写被代理类方法的处理器对象作为参数构造代理对象,类加载器用以在后面使用这个代理对象的时候能够由被代理类的类加载器所加载,类的实现接口用以使得这个代理对象可以对外宣称自己实现了这些接口,重写方法的处理器用于真正地重写那些需要代理的方法,也就真正实现了代人理事的效果。

    interface Subject{
            public void operate();
            public int func();
    }

    class SubjectImpl implements Subject{
            @Override
            public void operate() {
                  System. out.println( "real operate");
           }

            @Override
            public int func() {
                  System. out.println( "func");
                   return 2;
           }
           
    }

    public class TestClass {
            public static void main(String[] args) {
                  Subject subject = (Subject)Proxy.newProxyInstance(SubjectImpl. class.getClassLoader(), SubjectImpl.class.getInterfaces(), new InvocationHandler() {
                          @Override
                          public Object invoke(Object proxy, Method method, Object[] args)
                                       throws Throwable {
                                if(method.getName().equals( "operate"))
                                      System. out.println( "Proxy operate");
                                else {
                                      System. out.println( "func");
                                       return new Integer(1);
                               }
                                return null;
                         }
                  });
                  subject.operate();
                  System. out.println(subject.func());
           }
    }


    推荐文章

上一篇:Java培训:Spring事务嵌套的配置方法

下一篇:达内:java动态代理实例分析

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:每周一

Java--零基础周末班

Java--零基础周末班

开班日期:每周一

Java--大数据全日制班

Java--大数据全日制班

开班日期:每周一

Java--大数据周末班

Java--大数据周末班

开班日期:每周一

  • 地址:杭州市西湖区文三路259号昌地火炬大厦1号楼14层
  • 课程培训电话:18357109557 QQ:3163902815 全国免费咨询热线:400-111-8989
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56