简述

理解

意义:反射的意义是在于改变程序运行时的状态。
比如我在程序没运行之前,我不知道我需要什么对象,但是我想在程序运行的过程中去动态的说我想要什么东西,这时可以通过反射去实现。
通过反射可以调用运行时类的指定方法和属性。
任何一个类对反射来说结构都是暴露的。
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

反射需要四个类实现一些常用的功能:

  1. Class
  2. Field
  3. Medthod
  4. Constrator

使用反射机制要遵循以下三步:

  1. 获取要操作的类的Class对象
  2. 通过拿到这个Class对象,就可以拿到类的属性和方法
  3. 可以通过上面拿到的属性和方法去操作属性和方法

反射有什么用

通过反射API可以获取任何,是任何在运行时的对象和属性。

反射的功能:

  1. 构建对象
  2. 在运行时操作对象属性、方法、构造器
  3. 生成动态代理

Class 对象

使用反射第一步,获取Class对象。拿到Class对象才能接着往下操作。
Java 类在运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。

Class 类的实例表示Java应用程序运行时的类枚举或接口和注释(每个Java类运行时被表示为JVM中的类对象)
数组还映射到一个类对象,该类对象由具有相同元素类型和维度的所有数组共享。
基本类型布尔、字节、char、.、int、long、float、double和关键词void也表示为类对象。

1.手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件)
2.Class类只存私有构造函数,因此对应Class对象只能有JVM创建和加载
3.Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要

Class对象与反射机制

RRIT(Run-Time Type Identification)运行时类型识别。
它的功能是在运行时识别对象的类型和类信息。
有两种主要方式:

  1. "传统的"RTTI(它假定我们在编译时已经知道所有类型)和
  2. "反射"机制(它允许我们在运行时发现和使用类信息)。

无论何时编写和编译新类,都会生成一个Class对象,更恰当地说,保存在相同名称的A.class文件中。
当第一次使用所有类时,它们都被动态地加载到JVM中。
当我们新建一个对象或引用一个静态成员变量时,Java虚拟机(JVM)中的类加载器子系统将相应的类对象加载到JVM中,然后JVM从这个类型的信息中创建我们需要的类对象,或者提供静态变量的参考值。

Class 类的加载

java 中的类是按需加载的,用到时才会加载。
所有类在第一次使用时都动态地加载到JVM中。当程序创建对该类的第一个静态成员引用时,它加载使用的类(实际加载该类的字节码文件)。使用 new 操作符创建类的新实例对象也被视为对类的静态成员(构造函数也是一个类)的引用。

动态加载:

当使用这个类时,类加载器首先检查这个类的Class对象是否已经被加载。
如果未加载,则默认的ClassLorder 将 Class 对象将以相同的名称保存。
当该类的字节码文件被加载时,它们必须接受相关的验证,以确保它们不被破坏,并且不包含坏的Java代码(这是Java的安全机制检测)。
在没有问题之后,它们将被动态地加载到内存中,这相当于Class对象被加载到内存中,,并且还可以用于创建类的所有实例对象。

总结

万事开头第一步,反射开头Class,理解了反射的意义后,接下来就是怎么操作反射。
长篇大论,不如写个demo。