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