(一) 什么是反射?
反
射
就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能调用其任意一个方法和属性。这种动态获取信息及动态调用对象方法的功能叫
Java的反射机制
。
说明:
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个 类只有一个Class对象),这个对象就包含了完整的类的结构信息。可以通过这个对象查看到所对应类的所有信息。
(二) 反射能做什么?
(1)在运行时判断任意一个对象所属的类
(2)在运行时构造任意一个类的对象
(3)在运行时判断任意一个类所具有的成员变量和方法
(4)在运行时获取泛型信息
(5)在运行时调用任意一个对象的成员变量和方法
(6)在运行时处理注解
(7)生成动态代理
(三) Class类
通过对象可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接 口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含 了特定某个结构(class/interface/enum/annotation/primitive type/void/[])的有关信息。
(1) Class本身也是一个类
(2) Class 对象只能由系统建立
(3) 一个加载的类在 JVM 中只会有一个Class实例
(4)一个Class对象对应的是一个加载到JVM中的一个.class文件
(5) 每个类的实例都会记得自己是由哪个 Class 实例所生成
(6)通过Class可以完整地得到一个类中的所有被加载的结构
(7)Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得 相应的
Class对象
(四) 实际应用
I.获取Class类的实例
方式一:调用运行时类的属性
方式二:通过运行时类的对象,调用getClass()
方式三:调用Class的静态方法:formatName(String classPath)
方式四:使用类的加载器:ClassLoader
@Test public void test3() throws ClassNotFoundException {//获取运行时类的方式(前三种为重点) //方式一:调用运行时类的属性 Class clazz = Person.class; System.out.println(clazz); //方式二: 通过运行时类的对象,调用getClass() Person p1 = new Person(); Class clazz2 = p1.getClass(); System.out.println(clazz2); //方式三:调用Class的静态方法:formatName(String classPath) Class clazz3 = Class.forName("practice.Person"); Sy