专栏首页黑泽君的专栏java基础学习_反射、装饰模式、JDK新特性_day27总结

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

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

=============================================================================
=============================================================================
涉及到的知识点有:
    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类型。
                第三种需要这种类型的字符串就行(开发中用)。
                这种扩展更强,不需要知道具体的类,只提供字符串,按照配置文件加载就可以了。
示例代码如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 父类委托机制详解(全盘负责委托机制 )

        例如:用eclipse的打包工具将TestClassLoader输出成jre/lib/ext目录下的itcast.jar包,再在eclipse中运行这个...

    黑泽君
  • ubuntu 16.04安装软件常见错误 Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavaila

      因为刚装好的Ubantu系统,内部缺少很多软件源,这时,系统会自动启动软件源更新进程“apt-get”,并且它会一直存活。由于它在运行时,会占用软件源更新时...

    黑泽君
  • java中驼峰命名和下划线命名互转方法(代码实现)

    黑泽君
  • 反射 — Java 高级开发必须懂的

    理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。

    java思维导图
  • Java反射-高级开发必须懂的

    理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。

    良月柒
  • java 虚拟机内存划分,类加载过程以及对象的初始化

    虚拟机运行时内存 java内存划分 类加载顺序  类加载时机  类加载步骤  对象初始化顺序  构造代码块顺序 构造方法 顺序 内存区域   java内存图  ...

    noteless
  • 深度学习基础知识(一)--- 权重初始化 --- 概念

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    TeeyoHuang
  • java虚拟机笔记(三)

    类从被加载到虚拟机内存开始到卸载内存为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载

    小森啦啦啦
  • 神经网络到底该如何初始化?吴恩达Deeplearning.ai最新干货

    初始化会对深度神经网络模型的训练时间和收敛性产生重大影响。简单的初始化方法可以加速训练,但使用这些方法需要注意小心常见的陷阱。本文将解释如何有效地对神经网络参数...

    abs_zero
  • 虚拟机类加载机制(1)——类加载时机

    由于道行不够深,所以此篇类加载机制的讲解主要来自于《深入理解Java虚拟机——JVM高级特性与最佳实践》的第7章 虚拟机类加载机制。 在前面《初识Java反射》...

    用户1148394

扫码关注云+社区

领取腾讯云代金券