🔍 反射(Reflection) 是Java语言中一个强大的功能,允许程序在运行时检查和操作类、对象、方法等元数据。它是实现框架(如Spring、Hibernate)和动态代理的核心技术之一。

核心概念

  1. Class对象

    • 每个类在JVM中都会生成一个Class对象,通过它可获取类的元信息。
    • 示例:Person.classClass.forName("java.lang.String")
  2. 运行时获取信息

    • 通过反射可动态获取类的构造方法、字段、注解等。
    • 例如:
      Method[] methods = clazz.getMethods();  
      Field field = clazz.getDeclaredField("name");  
      
  3. 动态创建对象

    • 使用Class.newInstance()Constructor.newInstance()实现实例化。
  4. 访问私有成员

    • 通过setAccessible(true)绕过访问控制权限。

使用示例

🛠️ 基础用法

// 获取Class对象  
Class<?> clazz = Class.forName("com.example.Person");  

// 创建实例  
Object instance = clazz.newInstance();  

// 获取字段并设置值  
Field field = clazz.getDeclaredField("age");  
field.setAccessible(true);  
field.set(instance, 25);  

🛠️ 高级场景

  • 动态调用方法:Method method = clazz.getMethod("sayHello", String.class);
  • 注解处理:遍历Annotation[] annotations获取元数据
  • 通过Field.getType()获取字段类型信息

注意事项

⚠️ 安全限制

  • 反射可能破坏封装性,需谨慎使用setAccessible(true)
  • 部分JVM实现对反射调用有性能开销

⚠️ 兼容性

  • newInstance()在Java 9+已被弃用,建议使用getConstructor().newInstance()

扩展阅读

📚 想了解更多?可参考深入理解Java反射原理获取入门教程。

Java_Reflection
Reflection_Mechanism