一:反射的概述
反射是框架设计的灵魂,使用前必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性,方法和构造函数;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二:反射的入口:java.lang.Class
日常开发中的对象,分为两种,基本类型和引用类型:
- 基本类型,(固定的 8 种)
- 整数:byte, short, int, long
- 小数:float, double
- 字符:char
- 布尔值:boolean
- 引用类型
- 所有的引用类型都继承自 java.lang.Object
- 类,枚举,数组,接口都是引用类型
- java.io.Serializable 接口,基本类型的包装类(比如 java.lang.Double)也是引用类型
对每一种对象,JVM 都会实例化一个 java.lang.Class 的实例,java.lang.Class 为我们提供了在运行时访问对象的属性和类型信息的能力。Class 还提供了创建新的类和对象的能力。最重要的是,Class 是调用其他反射 API 的入口,我们必须先获得一个 Class 实例才可以进行接下来的操作。
(1)、一个类里都有什么
类名、类修饰符、包信息、父类、实现的接口、属性、方法、构造器(构造方法)、注解多部分组成。
(2)、属性有几部分组成
修饰符、类型、属性名、属性值四部分组成。
(3)、方法有几部分组成
修饰符、返回类型、方法名、参数列表、方法体、返回值
(4)、构造器几部分组成
修饰符、构造器名称(类名)、参数列表、方法体
三:获得入口:java.lang.Class
1.Object.getClass 方法
如果我们已经拿到了一个对象,可以很方便地使用它的 getClass 方法获得一个 Class 对象(当然这仅限于引用类型的对象):
Class strClass = "String".getClass();
返回的对象 strClass
是 String 类型。
2. .class 语法
如果我们当前没有某个类的对象,无法使用 getClass() 方法,那还可以使用另外一种方法获取 Class:在要获得的类名后加上 .class ,比如这样:
Integer.class.newInstance(); int.class.newInstance();
可以看到,这种方式不仅能用于引用类型,基本类型也可以。
3.Class.forName()
如果我们有一个类的完整路径,就可以使用 Class.forName(“类完整的路径”) 来得到相应的 Class,这个方法只能用于引用类型,比如:
Class<?> c = Class.forName("java.lang.String");
Class<?> aClass = Class.forName("com.ws.learn.Test");
4. 所有方法一览
四:从Class中获取成员信息
java.lang.reflect.Member
是一个接口,代表 Class 的成员,每个成员都有类型,分为是否从父类继承,还有是否可以直接访问。
Member 有三个实现类:
java.lang.reflect.Constructor
:表示该 Class 的构造函数java.lang.reflect.Field
:表示该 Class 的成员变量java.lang.reflect.Method
:表示该 Class 的成员方法
获取构造函数
java.lang.Class
提供了以下方法用于获取该类的构造函数:
注意:构造函数无法从父类继承
Constructor getConstructor(Class[] params)根据构造函数的参数,返回一个具体的具有public属性的构造函数
Constructor getConstructors() 返回所有具有public属性的构造函数数组
Constructor getDeclaredConstructor(Class[] params) 根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
Constructor getDeclaredConstructors() 返回该类中所有的构造函数数组(不分public和非public属性)
获取成员变量
java.lang.Class
提供了以下方法用于获取该类的成员变量:
Field getField(String name) 根据变量名,返回一个具体的具有public属性的成员变量
Field[] getFields() 返回具有public属性的成员变量的数组
Field getDeclaredField(String name) 根据变量名,返回一个成员变量(不分public和非public属性)
Field[] getDelcaredFields() 返回所有成员变量组成的数组(不分public和非public属性)
获取成员方法
java.lang.Class
提供了以下方法用于获取该类的成员方法:
Method getMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的具有public属性的方法
Method[] getMethods() 返回所有具有public属性的方法数组
Method getDeclaredMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的方法(不分public和非public属性)
Method[] getDeclaredMethods() 返回该类中的所有的方法数组(不分public和非public属性)