反射:框架设计的灵魂

类的加载

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

加载

​ 就是指将class文件读入内存,并为之创建一个Class对象。

​ 任何类被使用时系统都会建立一个Class对象

连接

​ 验证是否有正确的内部结构,并和其他类协调一致

​ 准备负责为类的静态成员分配内存,并设置默认初始化值

​ 解析将类的二进制数据中的符号引用替换为直接引用

初始化

​ 就是我们以前讲过的初始化步骤

类的初始化

1. 创建类的实例

2. 类的静态变量,或者为静态变量赋值

3. 类的静态方法

4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

5. 初始化某个类的子类

6.直接使用java.exe命令来运行某个主类

反射概述

框架:半成品软件。可以在框架的基础上进行软件开发,简化编码

反射:将java代码的各个组成部分封装为其他对象,可以在程序运行过程中操作这些对象,这就是java的反射机制,如下图。

反射的好处:

可以在程序运行过程中,操作这些对象。

可以解耦,提高程序的可扩展性。

反射:框架设计的灵魂

获取Class对象的方式

反射:框架设计的灵魂

获取Class对象的信息

知道怎么获取Class对象之后,接下来就介绍几个Class类中常用的方法了。

Class对象相关方法

String getSimpleName(); 获得简单类名,只是类名,没有包

String getName(); 获取完整类名,包含包名+类名

T newInstance() ;创建此 Class 对象所表示的类的一个新实例。要求:类必须有public的无参数构造方法

Constructor类

Constructor是构造方法类,类中的每一个构造方法都是Constructor的对象,通过Constructor对象可以实例化对象。

Class类中与Constructor相关方法

1. Constructor[] getConstructors()

    获取所有的public修饰的构造方法

2. Constructor getConstructor(Class... parameterTypes)

    根据参数类型获取构造方法对象,只能获得public修饰的构造方法。

如果不存在对应的构造方法,则会抛出 java.lang.NoSuchMethodException 异常。

参数是可变参数,调用此方法时,可以不写参数,获取的空参构造

                可以写参数,给定的参数必须是Class对象

                    比如:

                        参数 String name,int age

                        调用此方法: String.class,int.class

Constructor类中常用方法

1. T newInstance(Object... initargs)

   根据指定参数创建对象。

2. T newInstance()

   空参构造方法创建对象。

Method类

Method是方法类,类中的每一个方法都是Method的对象,通过Method对象可以调用方法。

Class类中与Method相关方法

1. Method[] getMethods()

   获取所有的public修饰的成员方法,包括父类中。

2. Method getMethod("方法名", 方法的参数类型... 类型)

根据方法名和参数类型获得一个方法对象,只能是获取public修饰的

Method类中常用方法

Object invoke(Object obj, Object... args)

   根据参数args调用对象obj的该成员方法

   如果obj=null,则表示该方法是静态方法