java反射本质是通过jvm加载类时生成的唯一class对象,在运行时“反向”操作类结构和行为;依靠class、field、method、constructor四大核心api实现动态访问;需注意性能开销、安全限制及泛型擦除等陷阱。

Java 反射是面试高频考点,理清逻辑比死记硬背更重要。核心就三点:为什么需要反射、它靠什么工作、用的时候要注意什么。下面按真实面试节奏分块梳理。
反射到底是什么?别只背定义
它不是“运行时查类信息”这么简单。本质是:JVM 在加载类时会生成唯一的 Class 对象,反射就是通过这个对象,在程序运行中“反向操作”类的结构和行为。就像照镜子——你看到自己(类的字段/方法),还能对着镜子里的自己做动作(调用私有方法、修改 private 字段)。
面试常问“为什么叫反射”?答:因为正常编码是“正向”(写 User user = new User()),而反射是“反向”(给个字符串 "User",把它变成对象)。这个比喻比术语更易被记住。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Class 对象怎么来?三种方式必须分清场景
-
类名.class:编译期已知类型,最安全、最快。比如 Spring 配置 Bean 时写
User.class。 -
对象.getClass():运行时才有实例,适合泛型擦除后确认真实类型,比如
list.get(0).getClass()。 -
Class.forName("全限定名"):类名来自配置、数据库或用户输入,动态加载。注意会触发类初始化(执行 static 块),
ClassLoader.loadClass()则不会。
操作字段、方法、构造器的关键步骤不能漏
无论访问 private 还是 public 成员,流程高度一致:
- 先用 Class 对象拿到 Field / Method / Constructor 实例(注意区分
getDeclaredXXX和getXXX:前者含私有,后者只公共+继承); - 对私有成员,必须调
setAccessible(true)关闭 JVM 访问检查; - 再执行具体操作:
field.set(obj, value)、method.invoke(obj, args)、constructor.newInstance(args)。
特别提醒:调用 invoke 时,第一个参数是目标对象(静态方法传 null),后面才是方法参数;set 和 get 的第一个参数也必须是实例对象(static 字段传 null)。
性能、安全、泛型这些坑,面试官最爱挖
- 性能慢在哪?不止是“反射慢”,而是每次调用都要解析字节码、做安全检查、绕过 JIT 优化。缓存 Method/Field 对象能显著改善;
-
private 能改 final 吗?可以设值,但若该字段是编译期常量(如
static final String s = "abc"),JVM 已内联,改了也看不到效果; -
泛型怎么绕过擦除?靠
ParameterizedType,比如在父类或接口上用getGenericSuperclass()获取带泛型的实际类型; - 安全风险:反射能突破封装,所以 Android 8.0+ 限制非 SDK 接口,JDK 12+ 默认禁用部分反射能力,需加启动参数放开。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










