1、反射的概念

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何
类的内部信息,并能直接操作任意对象的内部属性及方法。
(通俗来说,反射就是程序能够检查自身信息,程序会通过镜子的反光来查看自己本身一样)
框架 = 反射 + 注解 + 设计模式。

2、必知函数

  1. public final Class getClass()
  2. //返回一个Class类,此类事反射的源头,通过对象反射出类的名称

反射可以得到某个类的属性、方法、构造器、接口
1 类名.class(也称类字面常量) 方式生成Class对象不会初始化的静态块,不会初始化参数,不会调用构造函数
2 Class.forName()方式生成Class对象会初始化类静态块,但不会初始化非静态的代码块,也不调用构造函数
3 Object.getClass()方式生成Class对象会先初始化静态块,接着执行非静态块的初始化,最后调用构造函数

getName() 返回String形式的该类的名称。
newInstance() 根据某个Class对象产生其对应类的实例,它调用的是此类的默认构造方法(没有默认无参构造器会报错)
getClassLoader() 返回该Class对象对应的类的类加载器。
getSuperClass() 返回某子类所对应的直接父类所对应的Class对象

微信图片编辑_20210901101958.jpg
5 isArray():判定此Class对象所对应的是否是一个数组对象
6 getComponentType() :如果当前类表示一个数组,则返回表示该数组组件的 Class 对象,否则返回 null。
7 getConstructor(Class[]) :返回当前 Class 对象表示的类的指定的公有构造子对象。
8 getConstructors() :返回当前 Class 对象表示的类的所有公有构造子对象数组。
9 getDeclaredConstructor(Class[]) :返回当前 Class 对象表示的类的指定已说明的一个构造子对象。
10 getDeclaredConstructors() :返回当前 Class 对象表示的类的所有已说明的构造子对象数组。
11 getDeclaredField(String) :返回当前 Class 对象表示的类或接口的指定已说明的一个域对象。
12 getDeclaredFields() :返回当前 Class 对象表示的类或接口的所有已说明的域对象数组。
13 getDeclaredMethod(String, Class[]) :返回当前 Class 对象表示的类或接口的指定已说明的一个方法对象。
14 getDeclaredMethods() :返回 Class 对象表示的类或接口的所有已说明的方法数组。
15 getField(String) :返回当前 Class 对象表示的类或接口的指定的公有成员域对象。
16 getFields() :返回当前 Class 对象表示的类或接口的所有可访问的公有域对象数组。
17 getInterfaces() :返回当前对象表示的类或接口实现的接口。
18 getMethod(String, Class[]) :返回当前 Class 对象表示的类或接口的指定的公有成员方法对象。
19 getMethods() :返回当前 Class 对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。
20 isInstance(Object) :此方法是 Java 语言 instanceof 操作的动态等价方法。
21 isInterface() :判定指定的 Class 对象是否表示一个接口类型
22 isPrimitive() :判定指定的 Class 对象是否表示一个 Java 的基类型。
23 newInstance() :创建类的新实例

3、实例化Class

  1. //方式一:通过类名.class创建指定类的Class实例
  2. Class clazz1 = Person.class;
  3. System.out.println(clazz1);
  4. //方式二:通过运行时类的对象,getClass()
  5. Person p1 = new Person();
  6. Class clazz2 = p1.getClass();
  7. System.out.println(clazz2);
  8. //方式三:调用Class的静态方法:forName(String classPath)
  9. //其中方法的参数是你要获取类的全路径
  10. Class clazz3 = Class.forName("com.atguigu.java.Person");
  11. // clazz3 = Class.forName("java.lang.String");
  12. System.out.println(clazz3);
  13. System.out.println(clazz1 == clazz2);
  14. System.out.println(clazz1 == clazz3);
  15. //方式四:使用类的加载器:ClassLoader (了解)
  16. ClassLoader classLoader = ReflectionTest.class.getClassLoader();
  17. Class clazz4 = classLoader.loadClass("com.atguigu.java.Person");
  18. System.out.println(clazz4);
  19. System.out.println(clazz1 == clazz4);

4、通过反射获取调用类的完整结构

Filed、Method、Constructor、Superclass、Interface、Annotation

5、创建运行时类对象