精通 Java 反射:运行时检查类、方法与字段
精通 Java 反射
学习 Java 反射 API 如何在运行时检查和修改类、方法、字段、构造器,增强灵活性并实现强大动态行为。
Java 中反射允许在程序运行时检查和操作类、接口、构造器、方法和字段。
Java 提供 Class 类,封装类或接口的元数据。Class 实例是反射能力的入口。
获取 Class 对象
执行反射首先需要 Class 对象。三种常见获取方式:
- 使用
Class.forName()Class<Dog> clazz = Class.forName("com.example.Dog");该方法接受全限定类名,若类未加载则加载它。
- 对实例调用
getClass()Dog dog = new Dog(); Class<Dog> clazz = dog.getClass();获取对象的运行时类。
- 使用
.class字面量Class<Dog> clazz = Dog.class;提供编译期的
Class对象引用。
获得 Class 实例后,可查询其方法、字段、构造器和注解。
实战示例:检查 Dog 类
import java.lang.Class; import java.lang.reflect.*; class Animal {} public class Dog extends Animal { public void display() { System.out.println("I am a dog."); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); System.out.println("Name: " + clazz.getName()); System.out.println("Modifier: " + Modifier.toString(clazz.getModifiers())); System.out.println("Superclass: " + clazz.getSuperclass().getName()); } catch (Exception e) { e.printStackTrace(); } } }
输出
Name: com.example.Dog Modifier: public Superclass: com.example.Animal
此片段创建 Dog 实例,获取其 Class 对象,查询类名、访问修饰符和父类。
深入了解 Class,请查阅 官方 Java Class 文档。
探索字段、方法与构造器
java.lang.reflect 包提供专用类内省特定成员:
Method—— 方法详情。Field—— 字段详情。Constructor—— 构造器详情。
反射方法
Method 类暴露名称、返回类型、修饰符等元数据。简例:
import java.lang.reflect.*; class Dog { public void display() { System.out.println("I am a dog."); } private void makeSound() { System.out.println("Bark Bark"); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Method[] methods = dog.getClass().getDeclaredMethods(); for (Method m : methods) { System.out.println("Method Name: " + m.getName()); System.out.println("Modifier: " + Modifier.toString(m.getModifiers())); System.out.println("Return Type: " + m.getReturnType()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
输出
Method Name: display Modifier: public Return Type: void Method Name: makeSound Modifier: private Return Type: void
Method 完整工具列表,请访问 官方 Method 文档。
反射字段
字段可在运行时访问和修改。Field 类提供 get、set 和修饰符工具。示例:
import java.lang.reflect.*; class Dog { public String type; private String color; } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); // 公共字段 Field typeField = clazz.getField("type"); typeField.set(dog, "labrador"); System.out.println("Value: " + typeField.get(dog)); System.out.println("Modifier: " + Modifier.toString(typeField.getModifiers())); // 私有字段 Field colorField = clazz.getDeclaredField("color"); colorField.setAccessible(true); colorField.set(dog, "brown"); System.out.println("Value: " + colorField.get(dog)); System.out.println("Modifier: " + Modifier.toString(colorField.getModifiers())); } catch (Exception e) { e.printStackTrace(); } } }
输出
Value: labrador Modifier: public Value: brown Modifier: private
进阶用法请探索 Field 类文档。
反射构造器
构造器通过 Constructor 类内省。下面代码列出 Dog 所有构造器:
import java.lang.reflect.*; class Dog { public Dog() {} private Dog(int age) {} } public class Main { public static void main(String[] args) { try { Constructor<Dog>[] cons = Dog.class.getDeclaredConstructors(); for (Constructor<Dog> c : cons) { System.out.println("Constructor Name: " + c.getName()); System.out.println("Modifier: " + Modifier.toString(c.getModifiers())); System.out.println("Parameters: " + c.getParameterCount()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
输出
Constructor Name: Dog Modifier: public Parameters: 0 Constructor Name: Dog Modifier: private Parameters: 1
更多细节请见 Constructor 文档。
java
- 深入理解 Java final 关键字:变量、方法与类的不可变性
- Java instanceof 运算符完全指南:用法、继承与接口检查
- 精通 Java 继承:核心概念、类型与实战示例
- 深入理解 Java 静态嵌套类:用法、差异与实战示例
- 精通 Java 匿名内部类:定义、语法与实战示例
- Java 单例模式详解:安全实现与使用指南
- 精通 Java ArrayList:操作、方法与最佳实践
- Java Stack 类全面指南:用法、核心方法与实战示例
- Java HashSet 类完全指南:操作、方法与集合论实战
- 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
- 掌握 Java 泛型:构建可复用、类型安全的代码
- 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除