1. 反射机制深度解析
反射是Java语言中一项强大而基础的功能,它允许程序在运行时动态地获取类的信息并操作类或对象的属性和方法。这项特性为Java带来了极大的灵活性,但同时也带来了一定的性能开销和安全考量。
1.1 反射的核心价值与应用场景
反射机制打破了Java"编译时确定"的常规约束,主要应用于以下典型场景:
- 框架开发(如Spring的IoC容器)
- 动态代理实现
- 注解处理器
- 通用工具类开发
- 测试工具实现
注意:反射虽然强大,但不应滥用。在明确知道类结构的情况下,直接调用比反射效率高10-20倍。
1.2 Class对象获取的三种方式详解
1.2.1 Class.forName()方式
这是最灵活的获取方式,通过类的全限定名加载:
java复制Class<?> clazz = Class.forName("java.lang.String");
特点:
- 会触发类初始化(执行静态代码块)
- 需要处理ClassNotFoundException
- 适用于运行时才确定类名的场景
1.2.2 类名.class语法
最直接的方式:
java复制Class<String> stringClass = String.class;
特点:
- 不会触发类初始化
- 编译时类型检查
- 适用于明确知道类名的场景
1.2.3 对象.getClass()方法
通过实例对象获取:
java复制String str = "hello";
Class<? extends String> strClass = str.getClass();
特点:
- 获取的是运行时类型
- 需要已有对象实例
- 适用于多态场景下的类型判断
1.3 构造方法操作实践
反射获取构造方法的基本模式:
java复制Constructor<?>[] constructors = clazz.getDeclaredConstructors();
Constructor<?> publicConstructor = clazz.getConstructor(parameterTypes);
关键点:
- getConstructors()只能获取public构造方法
- getDeclaredConstructors()获取所有构造方法(包括private)
- 访问private构造方法需要先setAccessible(true)
- 通过Constructor.newInstance()创建对象
示例代码:
java复制Class<?> clazz = Class.forName("com.example.User");
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(tr
