java反射核心在于理解“运行时动态操作类”的逻辑链条:从class对象获取(class.forname触发初始化、user.class编译期安全、getclass支持多态),到字段操作(getfields仅public,getdeclaredfields含所有声明字段且需setaccessible访问私有),再到方法调用(getmethod查public,getdeclaredmethod查任意方法但需setaccessible)及构造器创建(getdeclaredconstructor获取带参私有构造器并setaccessible后newinstance)。

Java 反射核心考点演练,关键不在背API,而在理解“运行时动态操作类”的逻辑链条——从获取Class对象开始,到字段、方法、构造器的实际调用,每一步都要清楚“为什么这么写”“不这么写会怎样”。下面直击高频考点,分场景拆解。
一、Class对象怎么拿?三种方式的区别必须拎清
考试和面试最爱问:这三种获取方式,哪个能用于配置驱动的动态加载?哪个最安全?哪个需要异常处理?
- Class.forName("com.example.User"):运行时按字符串加载类,触发类初始化(执行static块),必须捕获ClassNotFoundException;框架(如JDBC驱动注册、Spring Bean加载)全靠它
- User.class:编译期确定,不触发初始化,无异常,类型安全;适合已知类、做泛型边界或注解处理器
- userInstance.getClass():已有对象才能用,返回真实运行时类型(支持多态,比如子类实例返回子类Class);不能用于未创建对象的场景
二、字段操作:getDeclaredFields() vs getFields() 是必考陷阱
给定一个User类含private name、protected id、public age、包级height,问:getFields()返回几个字段?getDeclaredFields()呢?
- getFields():只返回当前类+父类中所有public字段(不含private/protected/包级),本例只返回age
- getDeclaredFields():返回当前类声明的所有字段(含private、protected、包级),但不含父类字段;本例返回name、id、age、height共4个
- 访问私有字段必须加
field.setAccessible(true),否则IllegalAccessException;JDK 9+模块化项目需在module-info.java中opens对应包
三、方法调用:getMethod()和getDeclaredMethod()别混用
要调用一个private void encrypt(String pwd)方法,该用哪个?参数类型怎么写?
- getMethod("encrypt", String.class):只找public方法,找不到就抛NoSuchMethodException
-
getDeclaredMethod("encrypt", String.class):能找到private方法,但调用前必须
method.setAccessible(true) - 注意:参数类型必须是Class对象,不是实例,String.class不能写成"abc".getClass()
- invoke时第一个参数是目标对象(静态方法传null),后续才是实参,类型要严格匹配
四、构造器实战:如何用反射创建带参对象?
有一个User(String name, int age),如何用反射创建实例?
- 先用
clazz.getDeclaredConstructor(String.class, int.class)获取构造器 - 如果构造器是private,同样要
constructor.setAccessible(true) - 再调用
constructor.newInstance("张三", 25),注意参数顺序和类型必须一致 - 不要用已废弃的
clazz.newInstance()(仅支持无参且要求public)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











