跳转至

什么是反射机制?为什么反射慢?

面试回答

面试官: 反射是什么?为什么大家都说反射慢?

你:

反射就是让 Java 程序在运行期间能像照镜子一样看清自己——拿到任意一个类的所有信息,包括私有属性和方法,然后动态调用它。正常代码是编译器帮你写好调用,反射则是你写代码时压根不知道要调哪个类,运行时拿到类名字符串再找类、找方法、执行。

为什么慢?主要四点开销叠加:

第一,编译器优化全废了。正常方法调用,JIT 会把方法内联,取消方法调用的开销。但反射调用,JIT 很难分析你到底要调哪个方法,没法内联。

第二,每一步都有运行时校验。比如 Method.invoke(),每次调用都要检查访问权限(是不是 public、能不能访问),参数类型是否匹配,还要自动装箱拆箱基本类型。正常调用编译期就定了,没有这些检查。

第三,很多变长参数装箱和数组拷贝。反射调用方法时,参数是以 Object[] 传入的,方法内部要逐个检查并拆箱,把数组复制一份,额外产生大量临时对象。

第四,需要遍历查找方法。getMethod("xxx") 要根据方法名和参数类型去类的元数据里搜索匹配方法,而正常调用是直接指定,不会搜索。

但随着 JDK 版本提升(比如 MethodHandle 和 Lambda 形而上学),反射性能已经大幅改善,一般的业务调用瓶颈不会在这里,但极致性能场景(高频交易、核心循环)还是能省则省。


正常调用 vs 反射调用

deepseek_mermaid_20260612_d73e61.png

反射把编译期的工作搬到了运行时,多出权限检查、类型匹配、装箱拆箱等开销,加上 JIT 无法内联,自然就慢了。但对于大多数业务场景,这点开销远没到要命的地步,好用就好。