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 条评论
登录 后参与评论

相关文章

来自专栏余林丰

初识Java反射

要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念。本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认...

24610
来自专栏Java技术栈

一张图搞清楚Java异常机制

下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的。 ? Throwable Throwable是Java异常的顶级类,所有的异常...

2915
来自专栏积累沉淀

Java类加载原理机制

1.类的加载过程 JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)链接又分为三个步骤,如下图所示: ? 1...

24610
来自专栏C/C++基础

C++输入输出操作符重载

C++中输入操作符是>>,输出操作符是<<,又叫做流对象的“插入操作符”和“提取操作符“。其实这两个操作符最初是在C语言中用于整数的移位运算,到了C++中才利用...

872
来自专栏Python小屋

Python编写只允许实例化一个对象的类

>>> class T: __total = 0 def __init__(self, value): if T.__total != 0: r...

3358
来自专栏小樱的经验随笔

UVa 11461 - Square Numbers【数学,暴力】

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=...

3215
来自专栏我是业余自学C/C++的

二维变长数组

1405
来自专栏黑泽君的专栏

打印println()方法的逻辑

802
来自专栏开发技术

排序之简单选择排序

  本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中...

1082
来自专栏WD学习记录

牛客网 python (1)

1. python my.py v1 v2 命令运行脚本,通过 from sys import argv如何获得v2的参数值? 

1761

扫码关注云+社区

领取腾讯云代金券