杭州Java培训
达内杭州Java培训中心

15268258619

热门课程

达内:java的代理模式简介

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


    杭州达内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工程师月薪12.5K

达内教育总裁韩少云受邀出席GIE国际教育峰会做主题演讲

学员参加达内网络营销培训,获10万年薪入职微众传媒

选择城市和中心
贵州省

广西省

海南省