`
new_Line
  • 浏览: 10266 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_java 代理模式

 
阅读更多

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

基本概念:
    在Java程序中,代理就是在不修改源码的情况下,使得原本不具有某种行为的类对象具有该行为能力
特点:
    代理过程必须有两个实体参与,并且代理者要按照被代理者的意愿进行代理业务。
作用:
    为其他对象提供一种代理以控制对这个对象的访问。在某种情况下,一个客户不想或者不能直接引用另
    一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
代理模式涉及到角色:
    |--抽象角色:
        声明真实对象和代理对象的公共接口
    |--代理角色
        代理角色内部含有对真实对象的引用,从而可以操作真实对象
    |--真实角色
        代理角色所代表的真实对象,使我们最终要引用的对象

静态代理:
    演示说明:
        package com.itheima.proxy;
        /*
         * 面向接口编程
         * */
        public interface MyInter {
            public abstract void info();
        }
        package com.itheima.proxy;
        /*
         * 被代理类
         * */
        public class IsArgent implements MyInter {
            public void info()
            {
                System.out.println("制造商。。。");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        package com.itheima.proxy;
        /*
         * 这是一个代理类
         * */
        public class ProxyDemo {
            private MyInter mi;
            public ProxyDemo(MyInter mi)
            {
                this.mi = mi;
            }
            public long RunTime()
            {
                long start = System.currentTimeMillis();
                //执行需要被代理的方法
                mi.info();
                long end = System.currentTimeMillis();
                return end - start;
            }
        }
        package com.itheima.proxy;
        /*
         * 测试类
         * */
        public class Test {
            public static void main(String[] args) {
                ProxyDemo pd = new ProxyDemo(new IsArgent());
                long runTime = pd.RunTime();
                System.out.println(runTime);
            }
        }   
动态代理:
    所谓动态代理类,就是通过newProxyInstance()方法,在运行时自动生成的,在生成它时,
    必须为它提供一组要实现的接口,然后该类就宣称它实现了哪些接口。
    Java动态代理类位于java.lang.reflect包下,一般主要涉及到两个类。
    |--InvocationHandler:该接口仅定义了一个方法:
        |--Object invoke(Object proxy, Method method, Object[] args)
                    在代理实例上处理方法调用并返回结果。
            proxy:指代理类
            method:被代理的方法
            args:该方法的参数
    |--Proxy:该类即为动态代理类
        |--protected  Proxy(InvocationHandler h)
            使用其调用处理程序的指定值从子类(通常为动态代理类)构建新的 Proxy 实例。
        |--static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
            返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
        |--static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces)
            返回代理类的 java.lang.Class 对象,并向其提供类加载器和接口数组。
        |--
        演示说明:
            package com.itheima.dynamic.proxy;
            public interface Subject {
                public void request();
            }

            package com.itheima.dynamic.proxy;
            public class RealSubject implements Subject {
                @Override
                public void request()
                {
                    System.out.println("需要被代理的任务。。。");
                }
            }

            package com.itheima.dynamic.proxy;
            import java.lang.reflect.InvocationHandler;
            import java.lang.reflect.Method;
            public class DynamicSubject implements InvocationHandler {
                private Subject sub;
                public DynamicSubject(Subject sub)
                {
                    this.sub = sub;
                }
                @Override
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable
                {
                    System.out.println("被代理执行之前:" + method);
                    method.invoke(sub, args);
                    System.out.println("被代理执行之后:" + method);
                    return null;
                }
            }

            package com.itheima.dynamic.proxy;
            import java.lang.reflect.InvocationHandler;
            import java.lang.reflect.Proxy;
            public class Test {
                public static void main(String[] args) {
                    //创建被代理类的对象
                    Subject sub = new RealSubject();
                    //创建代理类对象,并将被代理类传递进去
                    InvocationHandler handler = new DynamicSubject(sub);
                    //获取代理类的Class对象
                    Class c = handler.getClass();
                    //通过Proxy.newProxyInstance()方法,自动生成一个动态代理类实例
                    sub = (Subject)Proxy.newProxyInstance(c.getClassLoader(), sub.getClass().getInterfaces(), handler);
                    //调用方法
                    sub.request();
                    System.out.println("------------------------------------------------");
                    System.out.println("自动生成动态代理类的名字:" + sub.getClass().getName());
                    Class[] interfaces = sub.getClass().getInterfaces();
                    for(Class item : interfaces)
                        System.out.println("自动生成动态代理类所实现的接口" + item);
                   
                }
            }
            运行结果:
                被代理执行之前:public abstract void com.itheima.dynamic.proxy.Subject.request()
                需要被代理的任务。。。
                被代理执行之后:public abstract void com.itheima.dynamic.proxy.Subject.request()
                ------------------------------------------------
                自动生成动态代理类的名字:$Proxy0
                自动生成动态代理类所实现的接口interface com.itheima.dynamic.proxy.Subject

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

分享到:
评论

相关推荐

    黑马程序员java面试宝典 完整版PDF.rar

    《黑马程序员Java面试宝典》是一本专门为Java开发者准备的面试指南,包含了广泛而深入的Java技术知识,以及面试过程中可能会遇到的各种问题。这本书的完整版PDF提供了丰富的学习材料,帮助求职者提升自己的技术水平...

    根据《JAVA与设计模式》整理的笔记及示例代码

    1. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 2. 组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。 3. 外观模式:提供一个统一的接口,用来访问子系统中的多个接口。 4. 桥接模式:...

    黑马程序员面试宝典(java)2018版

    《黑马程序员面试宝典(java)2018版》是一本专门为Java开发者准备的面试指南,涵盖了大量在面试过程中可能遇到的问题和知识点。这本宝典由黑马程序员机构精心编纂,汇集了近万名学员的实际面试经验,为求职者提供了...

    2023黑马面试宝典-Java面试宝典大全-java面试宝典黑马

    Java面试宝典是Java程序员求职面试的重要参考资料,它涵盖了Java编程语言的核心概念、高级特性、设计模式、并发处理、框架应用、数据库交互等多个方面。以下将详细解析这些关键知识点: 1. **Java基础**:面试中,...

    黑马程序员JAVA面试宝典2018年5月最新版

    《黑马程序员JAVA面试宝典2018年5月最新版》是一本专门为Java开发者准备的面试指南,它集合了2018年5月时最新的面试知识点和业界趋势,旨在帮助Java程序员在求职过程中更好地应对各类技术面试。这本书可能涵盖了Java...

    传智播客-黑马32期Java视频

    传智播客是知名的IT教育品牌,其“黑马程序员”系列课程在行业内享有较高的声誉,为许多初学者和进阶者提供了丰富的学习资源。 【描述】"市面最新,请各位慢用" 暗示这是一套较新的Java教学资料,涵盖了最新的技术...

    2018-2019年黑马最新版Java程序员面试宝典+题库pdf

    《2018-2019年黑马最新版Java程序员面试宝典+题库pdf》是一份集合了近年来Java编程领域重点知识和面试常见问题的综合资源。这份资料主要针对初级Java程序员,旨在帮助他们巩固基础知识,掌握面试技巧,以便在求职...

    黑马程序员的SpringCloud教程的demo压缩文件,包含了demo工程以及两个数据库(tb-user和tb-order)

    SpringCloud是中国IT教育品牌黑马程序员推出的一门高级微服务架构课程的实践项目压缩包,它包含了一个完整的demo工程,以及配套的两个数据库脚本:tb-user.sql和tb-order.sql。这个压缩包旨在帮助学习者深入理解和...

    Java设计模式(图解+框架源码分析+实战)- 黑马课件

    6. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问,可以用于远程代理、虚拟代理等。 7. **适配器模式**:将一个类的接口转换成客户希望的另一个接口,使原本因接口不兼容而无法一起工作的那些类可以...

    黑马程序员------代理类中invoke方法注意点

    在Java编程中,代理类(Proxy)是一种设计模式,它允许我们为已有对象创建一个代理对象,以便在调用实际对象的方法之前或之后添加额外的功能。`invoke`方法是Java动态代理中的核心方法,它位于`java.lang.reflect....

    RocketMQ黑马笔记

    "RocketMQ黑马笔记" RocketMQ是阿里巴巴开源的消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的一个顶级项目。目前RocketMQ在阿里云...

    2018最新版Java程序员面试宝典+题库

    这本书由"黑马程序员"机构出品,专门针对Java开发者在求职过程中的需求,帮助他们在面试中展现出扎实的技术功底。 1. **Java基础** - 类与对象:深入理解面向对象编程的基本概念,包括封装、继承、多态。 - 数据...

    Java面试宝典2018年5月最新版

    《Java面试宝典2018年5月最新版》是一部专门为Java开发者准备的面试指导书籍,由黑马程序员团队精心编纂,旨在帮助求职者掌握Java面试中的核心知识点,提高面试成功率。书中涵盖了2018年最热门、最重要的Java技术...

    SpringBoot-事务&AOP-黑马程序员学习笔记

    在Spring中,AOP通过代理模式实现,分为JDK动态代理和CGLIB代理。 1. **切面(Aspect)**:定义了关注点的模块化,包含通知(Advice)和切点(Pointcut)。 2. **通知(Advice)**:在特定连接点执行的代码,如前置...

    黑马入学Java知识—精华总结(下)

    通过阅读“黑马程序员入学Java知识—精华总结(下).doc”,你可以系统地复习和掌握这些知识点,为面试做好充分准备。记住,理论知识的掌握需要结合实践,通过编写代码和解决实际问题来加深理解。祝你在Java学习道路上...

    设计模式practice学习代码

    黑马程序员是一个知名的在线教育平台,这里可能包含了他们课程中的例子,如适配器模式、代理模式或策略模式等。 3. **dom4jtest**: DOM4J是一个Java XML处理库,它与设计模式的结合可能涉及到解析XML文档时如何...

    品优购项目面试问题200问(背会月薪过万不是梦)1

    最后,Spring框架的AOP(Aspect-Oriented Programming,面向切面编程)是用于实现横切关注点(如日志、事务管理)的一种编程模式。SpringAOP通过动态代理或字节码增强技术实现切面的织入,提供声明式事务管理等特性...

    Java面试宝典2018-最全面试资料

    这份资料由黑马程序员精心编纂,集合了多家知名公司的面试题目,涵盖了广泛且深入的Java知识点。 首先,基础篇中,你需要熟悉Java语言的基础语法,包括但不限于数据类型(基本类型与引用类型)、运算符、流程控制...

    传智播客Java面试宝典Beta5.0.rar

    这份资料由黑马程序员机构精心编纂,旨在帮助开发者巩固基础概念,熟悉框架和数据库等相关知识,以应对各种面试挑战。 在Java面试中,基础概念是首要的考察点。这包括但不限于: 1. **Java语法**:如数据类型、...

Global site tag (gtag.js) - Google Analytics