前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java基础学习_反射、装饰模式、JDK新特性_day27总结

java基础学习_反射、装饰模式、JDK新特性_day27总结

作者头像
黑泽君
发布2018-10-11 11:27:30
3400
发布2018-10-11 11:27:30
举报
文章被收录于专栏:黑泽君的专栏黑泽君的专栏

java基础学习_反射、装饰模式、JDK新特性_day27总结

代码语言:javascript
复制
=============================================================================
=============================================================================
涉及到的知识点有:
    1:反射(理解)
        (1)类的加载
        (2)类的初始化时机
        (3)类加载器
        (4)类加载器的组成
        (5)反射的概述
        (6)反射的使用
        (7)反射的案例
        (8)动态代理(中介)
        (9)Java中的代理类Proxy和调用处理接口InvocationHandler
        (10)代理类Proxy中的方法创建动态代理类对象
        (11)调用处理接口InvocationHandler的方法
        (12)动态代理案例
    2:设计模式
        A:模版设计模式(抽象类中用的多)
        B:装饰设计模式(IO流中用的多)
        C:适配器模式(GUI中用的多)
    3:JDK新特性
        (1)JDK5(掌握)
        (2)JDK6(很少见,了解)
        (3)JDK7(理解)
        (4)JDK8(了解)
=============================================================================
=============================================================================
1:反射(理解)
    (1)类的加载
        当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三步来实现对这个类进行初始化。
        
        加载 
            就是指将class文件读入内存,并为之创建一个Class对象。
            任何类被使用时系统都会建立一个Class对象。
        连接
            验证:是否有正确的内部结构,并和其他类协调一致。
            准备:负责为类的静态成员分配内存,并设置默认初始化值。
            解析:将类的二进制数据中的符号引用替换为直接引用。
        初始化 
            就是我们以前讲过的初始化步骤。
        
        注意:Object类的方法:
                public final Class getClass()    返回对象的字节码文件对象
             Class类的方法:
                public String getName()    以 String 的形式返回此 Class 对象所表示的实体名称。(实体包括:类、接口、数组名、基本类型或 void)
                    即:可以通过Class类中的一个方法,获取对象的真实类的全名称。
--------------------------------------
    (2)类的初始化时机
        1.创建类的实例时。
        2.访问类的静态变量,或者为静态变量赋值时。
        3.调用类的静态方法时。
        4.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象时。
        5.初始化某个类的子类时。
        6.直接使用java.exe命令来运行某个主类时。
--------------------------------------
    (3)类加载器
        负责将.class文件加载到内在中,并为之生成对应的Class对象。
        虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。
    (4)类加载器的组成
            Bootstrap ClassLoader     根类加载器
            Extension ClassLoader     扩展类加载器
            Sysetm ClassLoader        系统类加载器
        
        Bootstrap ClassLoader     根类加载器
            也被称为引导类加载器,负责Java核心类的加载。
            比如System类,String类等。在JDK中JRE的lib目录下rt.jar文件中(JDK8以前版本中的位置,JDK9/10位置变化了)。
            
        Extension ClassLoader     扩展类加载器
            负责JRE的扩展目录中jar包的加载。
            在JDK中JRE的lib目录下ext目录。
            
        Sysetm ClassLoader        系统类加载器
            负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。
            一般我们自己写的类通过系统类加载器来加载的。
            
        如果我们仅仅站在这些class文件的角度,我们如何来使用这些class文件中的内容呢?
--------------------------------------
    (5)反射的概述
        JAVA反射机制是在运行状态中,
        对于任意一个类,都能够知道这个类的所有属性和方法(动态获取信息);
        对于任意一个对象,都能够调用它的任意一个方法和属性(动态调用对象的方法);
        这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
        简言之:通过字节码文件对象,去使用该文件中的成员变量、构造方法、成员方法。
        
        要想解剖一个类,必须先要获取到该类的字节码文件对象。
        而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。

        获取class文件对象的方式:
            A:Object类的getClass()方法
            B:数据类型的静态属性class(任意数据类型都具备一个class静态属性)
            C:Class类中的静态方法(将类名作为字符串传递给Class类中的静态方法forName)
              public static Class forName(String className)

            1:Person p = new Person();
              Class c = p.getClass();

            2:Class c2 = Person.class;
              任意数据类型都具备一个class静态属性,看上去要比第一种方式简单。

            3:将类名作为字符串传递给Class类中的静态方法forName()即可。
              注意:需要类的全路径(带包名的路径)
              Class c3 = Class.forName("Person");
                
            4:第三种和前两种的区别        
                前两种你必须明确Person类型。
                第三种需要这种类型的字符串就行(开发中用)。
                这种扩展更强,不需要知道具体的类,只提供字符串,按照配置文件加载就可以了。
示例代码如下:
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档