Java反射完全指南
1. 什么是反射?
生活中的比喻
想象一下,你有一个神奇的X光眼镜,戴上它你不仅能看到一个人的外表,还能看到他的内部构造:骨骼、肌肉、血管等。Java反射就像这副X光眼镜,它让我们能够在程序运行时"透视"一个类的内部结构。
技术定义
反射(Reflection) 是Java提供的一种机制,允许程序在运行时检查和操作类、接口、字段和方法的信息,即使在编译时不知道它们的名字。
2. 为什么需要反射?
传统方式的局限
// 传统方式:编译时就必须知道类名
Person person = new Person();
person.setName("张三");
反射的优势
// 反射方式:运行时动态确定类名
String className = "com.example.Person"; // 可能来自配置文件
Class<?> clazz = Class.forName(className);
Object person = clazz.newInstance();
3. 反射的核心:Class对象
Class对象是什么?
每个类在JVM中都有一个对应的Class对象,它包含了该类的所有信息(元数据)。就像每个人都有一张身份证,记录着个人信息一样。
获取Class对象的三种方式
// 方式一:通过类名.class
Class<Person> clazz1 = Person.class;// 方式二:通过对象.getClass()
Person person = new Person();
Class<?> clazz2 = person.getClass();// 方式三:通过Class.forName()
Class<?> clazz3 = Class.forName("com.example.Person");
4. 反射的主要功能
4.1 获取类的基本信息
public class ReflectionExample {public static void main(String[] args) throws Exception {Class<?> clazz = Person.class;// 获取类名System.out.println("类名: " + clazz.getName());System.out.println("简单类名: " + clazz.getSimpleName());// 获取父类System.out.println("父类: " + clazz.getSuperclass().getName());// 获取接口Class<?>[] interfaces = clazz.getInterfaces();for (Class<?> inter : interfaces) {System.out.println("接口: " + inter.getName());}}
}
4.2 获取和操作字段
public class Person {private String name;public int age;protected String address;// 构造器和方法...
}public c