Java反射(Reflection)是一种强大的机制,它允许程序在运行时获取和操作类、接口、字段和方法的信息。反射的核心原理是通过Java虚拟机(JVM)在运行时动态地加载类,获取类的结构信息,然后通过这些信息来创建对象、调用方法等。
反射的基本步骤如下:
加载类:通过Class.forName()
方法或ClassLoader
类的loadClass()
方法来动态加载类。这些方法会在JVM中查找并加载指定的类文件。
获取类信息:加载类后,可以通过Class
类的静态方法来获取类的信息,如类名、修饰符、父类、接口、字段、方法等。例如,clazz.getName()
返回类名,clazz.getInterfaces()
返回实现的接口列表。
创建对象:通过Class
类的newInstance()
方法(已过时,不推荐使用)或Constructor
类的newInstance()
方法来创建类的实例。这些方法会根据类的构造函数动态地分配内存,并调用构造函数初始化对象。
访问字段和方法:通过Field
类和Method
类的静态方法来访问类的字段和方法。例如,field.get(obj)
可以获取对象的某个字段的值,method.invoke(obj, args)
可以调用对象的某个方法。需要注意的是,访问私有字段和方法时需要使用setAccessible(true)
方法来绕过Java的访问控制检查。
修改字段值:通过Field
类的set()
方法来修改对象的某个字段的值。需要注意的是,修改私有字段时需要使用setAccessible(true)
方法来绕过Java的访问控制检查。
反射的优点:
反射的缺点: