字节码与反射增强

共 19 题
#

1. JVM TI(Tool Interface)的工程应用,如何实现内存/线程采样与热更新,其 Agent 加载方式与性能开销、与 JFR/Arthas 的定位差异如何?

A JVM TI 是底层接口,JFR 低开销监控,Arthas 交互诊断 ✓ 正确答案
B JFR 是底层接口
C Arthas 是 JVM TI
D 三者定位相同
#

2. JDK 25 与 JDK 26 中 MethodHandle 与 LambdaMetafactory 的性能拐点?

A 首次慢、JIT 后接近直接调用,JDK 25/26 优化调用路径 ✓ 正确答案
B 与反射相同
C 一直慢
D 无 JIT 优化
#

3. ByteBuddy 的 Fluent API 与优势

A 只能改现有类
B 无拦截能力
C Fluent API 链式声明式生成字节码,易用且强大 ✓ 正确答案
D 需手写字节码
#

4. Instrumentation 与 -javaagent

A Instrumentation 无法转换类
B -javaagent 加载 premain 注册 Instrumentation transformer,类加载时增强 ✓ 正确答案
C 与字节码无关
D -javaagent 是运行时 attach
#

5. Java Attach API 与动态 Agent

A 需重启
B 只能启动时加载
C 无法增强已加载类
D 运行时 attach + agentmain 用 retransform 增强已加载类 ✓ 正确答案
#

6. 反射的性能开销来源,安全检查、装箱与动态分派,MethodHandle 如何优化?

A 两者相同
B MethodHandle 更慢
C 反射慢在安全检查/装箱/动态分派,MethodHandle 可内联且少装箱 ✓ 正确答案
D 反射可内联
#

7. 运行时生成字节码的常见场景,动态代理、ORM 映射、AOP 拦截如何实现?

A 这些场景无需字节码
B 只能静态生成
C 只需手写字节码
D 动态代理、ORM 映射、AOP 拦截都用运行时生成类实现 ✓ 正确答案
#

8. 字节码指令集入门,aload/iload/invokevirtual 等指令与 JVM 栈帧的关系如何?

A 字节码用寄存器
B 无操作数栈
C invokevirtual 操作堆
D 栈帧含局部变量表与操作数栈,指令在栈上操作 ✓ 正确答案
#

9. Java Agent 字节码增强失败的常见原因(已加载类、模块封装、字节码校验)与排查

A 模块封装无影响
B 任意类都可直接增强
C 已加载类需 retransform、模块封装需 --add-opens、非法字节码校验失败 ✓ 正确答案
D 校验无关
#

10. VarHandle 相比 sun.misc.Unsafe 的安全性与内存访问能力(原子操作、内存栅栏)

A 两者相同
B VarHandle 是公共 API 类型安全,支持原子操作与内存栅栏,替代 Unsafe ✓ 正确答案
C Unsafe 更安全
D VarHandle 无原子操作
#

11. record 类的反射访问在 JDK 17 sealed types 下的边界?

A 反射无限制
B record 是 final 不可继承,组件反射可用但受模块封装限制 ✓ 正确答案
C sealed 与 record 无关
D record 可继承
#

12. MethodHandle(java.lang.invoke 体系)的工程应用

A 只能反射
B 无法内联
C 高性能动态调用、VarHandle 字段访问、lambda 生成 ✓ 正确答案
D 只用于调用静态方法
#

13. Java Agent 与 Instrumentation,premain/agentmain 的字节码增强时机如何?

A 两者时机相同
B premain 类加载前增强,agentmain 运行时增强已加载类需 retransform ✓ 正确答案
C agentmain 增强未加载类
D premain 在 main 后
#

14. MethodHandle 与 VarHandle,为什么比反射快,invokeExact 的类型约束如何?

A 两者性能相同
B invokeExact 自动转换类型
C 反射可内联
D 可内联且 invokeExact 强类型免装箱,性能接近直接调用 ✓ 正确答案
#

15. Java Agent 的 premain 与动态 attach,字节码插桩的实现机制如何?

A 无需 Instrumentation
B 只能静态改
C 注册 transformer 在类加载/retransform 时修改字节码 ✓ 正确答案
D transform 只读不改
#

16. CGLIB 与 JDK 代理的选择,final 类/方法与接口代理的限制如何?

A JDK 代理可代理具体类
B CGLIB 可代理 final 类
C JDK 代理限接口,CGLIB 代理非 final 类,final 类/方法不可代理 ✓ 正确答案
D 两者无限制
#

17. 字节码增强与 Java Agent 的配合,Instrumentation 的 retransform 机制如何?

A 对已加载类重新触发 transformer 替换字节码,保留实例 ✓ 正确答案
B 需重新加载类
C 实例被丢弃
D 静态块重跑
#

18. 反射 setAccessible 在 JPMS 模块封装下的限制与 --add-opens

A 无需加参数
B setAccessible 总是有效
C 模块封装私有成员,需 --add-opens 或 opens 声明才能反射访问 ✓ 正确答案
D 模块封装无影响
#

19. 字节码增强(CGLIB/ASM)在 GraalVM Native Image 下的限制与构建期生成替代

A CGLIB 在 Native 下可用
B Native Image 无运行时类生成,动态增强受限,替代是构建期生成 ✓ 正确答案
C 无需替代
D 运行时生成正常