意义:反射的意义是在于改变程序运行时的状态。 比如我在程序没运行之前,我不知道我需要什么对象,但是我想在程序运行的过程中去动态的说我想要什么东西,这时可以通过反射去实现。 通过反射可以调用运行时类的指定方法和属性。 任何一个类对反射来说结构都是暴露的。 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
反射需要四个类实现一些常用的功能:
使用反射机制要遵循以下三步:
通过反射API可以获取任何,是任何在运行时的对象和属性。
反射的功能:
使用反射第一步,获取Class对象。拿到Class对象才能接着往下操作。 Java 类在运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。
Class 类的实例表示Java应用程序运行时的类枚举或接口和注释(每个Java类运行时被表示为JVM中的类对象) 数组还映射到一个类对象,该类对象由具有相同元素类型和维度的所有数组共享。 基本类型布尔、字节、char、.、int、long、float、double和关键词void也表示为类对象。
1.手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件) 2.Class类只存私有构造函数,因此对应Class对象只能有JVM创建和加载 3.Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要
RRIT(Run-Time Type Identification)运行时类型识别。 它的功能是在运行时识别对象的类型和类信息。 有两种主要方式:
无论何时编写和编译新类,都会生成一个Class对象,更恰当地说,保存在相同名称的A.class文件中。 当第一次使用所有类时,它们都被动态地加载到JVM中。 当我们新建一个对象或引用一个静态成员变量时,Java虚拟机(JVM)中的类加载器子系统将相应的类对象加载到JVM中,然后JVM从这个类型的信息中创建我们需要的类对象,或者提供静态变量的参考值。
java 中的类是按需加载的,用到时才会加载。 所有类在第一次使用时都动态地加载到JVM中。当程序创建对该类的第一个静态成员引用时,它加载使用的类(实际加载该类的字节码文件)。使用 new 操作符创建类的新实例对象也被视为对类的静态成员(构造函数也是一个类)的引用。
动态加载:
当使用这个类时,类加载器首先检查这个类的Class对象是否已经被加载。 如果未加载,则默认的ClassLorder 将 Class 对象将以相同的名称保存。 当该类的字节码文件被加载时,它们必须接受相关的验证,以确保它们不被破坏,并且不包含坏的Java代码(这是Java的安全机制检测)。 在没有问题之后,它们将被动态地加载到内存中,这相当于Class对象被加载到内存中,,并且还可以用于创建类的所有实例对象。
万事开头第一步,反射开头Class,理解了反射的意义后,接下来就是怎么操作反射。 长篇大论,不如写个demo。