亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

精通 Java 反射:运行时检查类、方法与字段

精通 Java 反射

学习 Java 反射 API 如何在运行时检查和修改类、方法、字段、构造器,增强灵活性并实现强大动态行为。

Java 中反射允许在程序运行时检查和操作类、接口、构造器、方法和字段。

Java 提供 Class 类,封装类或接口的元数据。Class 实例是反射能力的入口。


获取 Class 对象

执行反射首先需要 Class 对象。三种常见获取方式:

  1. 使用 Class.forName()
    Class<Dog> clazz = Class.forName("com.example.Dog");

    该方法接受全限定类名,若类未加载则加载它。

  2. 对实例调用 getClass()
    Dog dog = new Dog(); Class<Dog> clazz = dog.getClass();

    获取对象的运行时类。

  3. 使用 .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 类暴露名称、返回类型、修饰符等元数据。简例:

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

  1. 深入理解 Java final 关键字:变量、方法与类的不可变性
  2. Java instanceof 运算符完全指南:用法、继承与接口检查
  3. 精通 Java 继承:核心概念、类型与实战示例
  4. 深入理解 Java 静态嵌套类:用法、差异与实战示例
  5. 精通 Java 匿名内部类:定义、语法与实战示例
  6. Java 单例模式详解:安全实现与使用指南
  7. 精通 Java ArrayList:操作、方法与最佳实践
  8. Java Stack 类全面指南:用法、核心方法与实战示例
  9. Java HashSet 类完全指南:操作、方法与集合论实战
  10. 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
  11. 掌握 Java 泛型:构建可复用、类型安全的代码
  12. 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除