标准答案
- 反射可以在运行时读取类、字段、方法和注解,框架据此完成绑定、序列化和依赖注入。
- JDK 动态代理通常代理接口,字节码或子类代理可以覆盖更多类型但有 final 和模块边界限制。
- 反射访问私有成员、动态加载类和执行方法必须有权限与来源边界。
- 热路径中的反射调用要评估缓存 Method、MethodHandle 或直接代码的性能差异。
题目解析
反射和代理把类型检查、调用关系和部分错误推迟到运行时,适合框架扩展、插件和横切逻辑,但会增加启动、调试、模块访问和性能成本。代理本身不自动提供事务或权限。
JDK 动态代理通常基于接口,子类/字节码代理会受到 final、构造器和模块边界限制。排查切面失效时要确认实际对象、代理类型和调用是否经过代理。
动态类、类加载器和插件生命周期必须可回收,热部署和反复生成代理可能造成元空间增长。反射访问私有成员和加载外部类还要有来源、权限和审计边界。
常见误区
- 误区:用反射绕过权限校验。改正:反射只改变调用方式,资源访问仍必须执行授权和输入校验。
- 误区:认为所有类都能被 CGLIB 子类代理。改正:检查 final、构造器、模块和实际代理机制的限制。
- 误区:动态生成类没有清理。改正:管理类加载器生命周期,监控类数量和元空间,避免热部署泄漏。