# 1. Class<T>.cast 与普通强制类型转换相比提供什么动态类型保证,Class.asSubclass 又解决什么问题 A cast 是编译期检查 B cast 做运行时类型检查返回实例,asSubclass 做运行时类型层次验证并收窄 Class 类型 ✓ 正确答案 C asSubclass 返回实例 D cast 不做检查
# 2. VarHandle 在原子操作与字段访问的应用 A VarHandle 只能用于 Atomic 类 B VarHandle 提供字段/数组的原子操作与内存访问控制,类型安全、性能好,替代部分 Unsafe 功能 ✓ 正确答案 C VarHandle 只能访问 static 字段 D VarHandle 不如 Atomic 类安全
# 3. 从原始类型 API 迁移到参数化 API 时,怎样缩小 unchecked 警告范围并发现潜在 ClassCastException A 迁移后仍有 unchecked 警告 B @SuppressWarnings 应放整个类 C 迁移与运行时 CCE 无关 D 逐个处理 unchecked 警告、局部 @SuppressWarnings、用测试覆盖类型,让编译器捕捉类型错误并发现 CCE ✓ 正确答案
# 4. 方法引用遇到重载与泛型方法时,编译器如何根据函数式接口目标签名选择候选方法 A 方法引用按目标函数式接口签名做重载解析与泛型推断,选择签名兼容的最具体候选 ✓ 正确答案 B 方法引用不重载解析 C 重载时总是报错 D 泛型方法引用无法推断
# 5. 模式匹配 instanceof 对泛型类型变量有哪些限制,成功匹配后编译器能保留哪些类型信息 A 泛型擦除使 instanceof 只能匹配可具体化类型(List<?>),无法匹配 List<String>,模式变量保留可具体化类型 ✓ 正确答案 B instanceof 可匹配 List<String> C instanceof 保留泛型参数 D List<String> 具体化
# 6. 通配符捕获辅助方法如何修改 List<?> 中的元素,为什么直接写入非 null 值无法通过编译 A List<?> 可写任意非 null 值 B 通配符捕获使类型变成动态 C List<?> 可写 null 之外的值 D List<?> 不能写非 null(类型未知),用 <T> 辅助方法捕获通配符为类型变量后可安全操作 ✓ 正确答案
# 7. @Repeatable 注解的容器类型(Container Annotation)合成机制 A 容器注解是可选 B 重复注解只能读取容器 C 容器注解不含数组 D @Repeatable 需定义容器注解(含数组成员),编译器把重复注解合成进容器,getAnnotationsByType 统一读取 ✓ 正确答案
# 8. @SafeVarargs 的合法场景 A 可用于任意方法 B @SafeVarargs 用于 static/final/private 且安全使用 varargs(不暴露数组)的方法,抑制堆污染警告 ✓ 正确答案 C 它用于可变方法 D 它增加堆污染
# 9. @SuppressWarnings("unchecked") 的正确范围 A 应最小化范围(局部声明/方法/类),避免掩盖其他 unchecked 警告,配合注释说明理由 ✓ 正确答案 B 应放整个类 C 范围越大越好 D 它不抑制警告
# 10. AccessibleObject.setAccessible(true) 在 JDK 17 强封装下的合法性边界 A setAccessible 永远合法 B JDK 17 强封装下,setAccessible 需模块 opens 才合法,否则抛异常,反射框架需 --add-opens ✓ 正确答案 C 强封装不影响反射 D setAccessible 不再需要
# 11. Annotation 的合成与继承机制 A 所有注解都继承 B @Inherited 使类注解可被子类继承查询,@Repeatable 合成为容器注解,接口/方法注解不继承 ✓ 正确答案 C 方法注解继承 D 接口注解继承给实现类
# 12. CGLIB 与 ByteBuddy 字节码生成原理对比 A CGLIB 更现代 B ByteBuddy 更老 C ByteBuddy 不用 ASM D 两者都用 ASM 生成字节码,CGLIB 较老低层,ByteBuddy 现代高层 API 更强大友好,被现代框架采用 ✓ 正确答案
# 13. CGLIB 通过 FastClass 机制绕过反射调用的性能优势与 final 方法/类的限制 A FastClass 用反射调用 B final 类可被 CGLIB 代理 C FastClass 用索引直接调用绕过反射提性能,但 CGLIB 靠继承子类,final 类/方法无法代理 ✓ 正确答案 D FastClass 与性能无关
# 14. Class<? extends X> 的反射 API 限制 A 它提供完整泛型信息 B 它可精确匹配具体类型 C 它提供类型上界约束,但反射 API 受擦除限制,泛型信息可能丢失,newInstance 需无参构造 ✓ 正确答案 D 它不受擦除影响
# 15. Class<?>.getDeclaredFields() 在模块化(JPMS)下跨模块反射访问的限制与 opens 指令 A getDeclaredFields 可访问任何私有字段 B JPMS 强封装下跨模块访问私有成员需模块 opens(--add-opens 或 opens 指令),否则 setAccessible/访问抛异常 ✓ 正确答案 C opens 只影响导出 D 强封装不影响反射
# 16. Class<T> 与 Type 的层次结构 A Type 和 Class 无关 B Type 只有 Class 一个实现 C Class 描述泛型参数 D Type 是根接口,子接口含 Class、ParameterizedType、TypeVariable、WildcardType、GenericArrayType,用于描述泛型类型 ✓ 正确答案
# 17. Class.getGenericSuperclass 与 ParameterizedType 在反射获取泛型实参的细节 A getGenericSuperclass 返回 Class B 父类带泛型时 getGenericSuperclass 返回 ParameterizedType,getActualTypeArguments 获取泛型实参,是反射取泛型的关键 ✓ 正确答案 C 泛型实参无法获取 D ParameterizedType 不含实参
# 18. JDK 21 模式匹配与记录类结合的解构模式(Deconstruction Pattern) A record pattern 只能匹配不能解构 B JDK 21 解构模式把记录组件绑定为模式变量,支持 instanceof 与 switch,可嵌套解构 ✓ 正确答案 C 解构模式只用于普通类 D 解构模式不能用于 switch
# 19. JDK 8 元注解(@Repeatable、@Target 扩展)的应用 A @Target 只支持声明 B @Repeatable 只在 JDK 9 C @Repeatable 支持重复注解,@Target 新增 TYPE_USE/TYPE_PARAMETER 支持类型注解与类型参数注解 ✓ 正确答案 D TYPE_USE 只能用于类
# 20. JDK 动态代理(Proxy/InvocationHandler)的实现原理与只能代理接口的原因(生成 $Proxy0 继承 Proxy) A 生成的 $Proxy0 继承 Proxy 并实现接口,方法转发到 InvocationHandler,因单继承占用 Proxy 只能代理接口 ✓ 正确答案 B 代理类继承目标类 C 可代理任意类 D 代理类不继承 Proxy
# 21. Jackson 或 Spring 中传递 ParameterizedTypeReference 时,如何跨越擦除保留响应体的嵌套泛型 A 它用反射无法保留泛型 B 它不解决擦除 C 它只保留顶层泛型 D 用匿名子类捕获泛型实参(getGenericSuperclass 读 signature),反序列化按完整泛型处理,跨越擦除 ✓ 正确答案
# 22. Java 17 模式匹配 instanceof 后类型擦除的影响 A instanceof 可匹配 List<String> B 擦除不影响模式匹配 C 擦除使 instanceof 只能匹配可具体化类型,List<String> 非法,List<?> 可匹配且模式变量保留可具体化类型 ✓ 正确答案 D instanceof 保留泛型参数
# 23. Java 17+ 反射模块化(强封装)与 --add-opens A JDK 17 默认不封装 B JDK 17 强封装内部 API,反射框架需 --add-opens 开放特定包,最小化开放以控制风险 ✓ 正确答案 C 强封装不影响反射 D --add-opens 无风险
# 24. Java 25 ScopedValue(JEP 506)与反射访问的关系 A ScopedValue 是线程本地数据传递机制,常规用 try-with-resources 绑定,反射访问需遵循模块封装,二者无直接绑定 ✓ 正确答案 B ScopedValue 依赖反射实现 C ScopedValue 只能反射访问 D ScopedValue 与 ThreadLocal 完全相同
# 25. Java 8 Lambda 与目标类型推断 A Lambda 有自含类型 B Lambda 类型总是 Runnable C Lambda 类型由目标函数式接口上下文推断,赋值/参数/返回等上下文决定其类型 ✓ 正确答案 D Lambda 无需上下文
# 26. Java 泛型类型擦除的实现机制与运行时影响 A 运行时保留泛型参数 B 编译时把泛型参数替换为上界并插入强转,运行时无泛型信息,影响 instanceof/数组/反射 ✓ 正确答案 C instanceof 可检查泛型参数 D 可创建泛型数组
# 27. List<String> 与 List<Integer> 在运行时的相等性 A 运行时 Class 不同 B 泛型参数运行时可见 C instanceof 可区分 D 擦除使两者运行时 Class 相同,无法区分泛型参数,内容相等性由元素决定 ✓ 正确答案
# 28. Lookup 与 MethodHandle 的查找语义 A findVirtual 用于静态方法 B Lookup 无访问控制 C Lookup 封装调用者的访问上下文,用 findVirtual/findStatic 等查找方法生成 MethodHandle,访问受模块/类约束 ✓ 正确答案 D MethodHandle 只能通过反射获取
# 29. MethodHandle 与 VarHandle 的能力边界 A MethodHandle 用于字段原子操作 B MethodHandle 面向方法调用(可内联、绑定),VarHandle 面向字段/数组原子访问,二者互补 ✓ 正确答案 C VarHandle 用于方法调用 D 两者能力相同
# 30. MethodHandle(JDK 7+)与 LambdaMetafactory 在高性能反射调用中的取舍 A 两者都比反射慢 B 反射最快 C MethodHandle 不用内联 D MethodHandle 直接调用方法句柄可内联,LambdaMetafactory 生成函数式接口实例并内联,都比反射快 ✓ 正确答案
# 31. ParameterizedType、WildcardType、TypeVariable 与 GenericArrayType 分别描述哪些反射类型结构 A ParameterizedType 描述通配符 B TypeVariable 描述参数化类型 C GenericArrayType 描述普通数组 D ParameterizedType 描述参数化类型、WildcardType 通配符、TypeVariable 类型变量、GenericArrayType 泛型数组 ✓ 正确答案
# 32. Recursive Type Bound(<T extends Comparable<T>>)的应用 A <T extends Comparable<T>> 约束 T 必须可比较自身,用于泛型排序/比较算法 ✓ 正确答案 B 递归上界与比较无关,只用于数字运算 C Comparable<? super T> 总是比 Comparable<T> 更不灵活 D 递归上界只用于数字,不能用于对象类型
# 33. ServiceLoader 的懒加载(lazy iteration)与 @AutoService 注解自动生成 META-INF/services 配置 A ServiceLoader 加载时立即实例化全部 B ServiceLoader 不懒加载 C @AutoService 手动维护配置 D ServiceLoader 迭代时按需实例化(懒加载),@AutoService 编译期自动生成 META-INF/services 配置 ✓ 正确答案
# 34. StackWalker 替代 getStackTrace 的取舍 A getStackTrace 更高效 B StackWalker 只能取全部帧 C StackWalker 按需遍历栈帧、只取所需信息,比 getStackTrace 创建完整数组更高效 ✓ 正确答案 D 两者开销相同
# 35. TypeToken(Gson)解决泛型擦除的工程方案 A TypeToken 无法保留泛型 B TypeToken 用匿名子类捕获泛型实参,Gson 反序列化按完整泛型处理,解决擦除 ✓ 正确答案 C TypeToken 用运行时动态类型 D TypeToken 只保顶层
# 36. sun.misc.Unsafe 的禁用与替代 A 无替代方案 B Unsafe 是稳定公开 API C Unsafe 永不限制 D Unsafe 是危险内部 API,受强封装限制,替代用 VarHandle(原子)、MemorySegment(内存)、LockSupport(park) ✓ 正确答案
# 37. super 通配符的写入限制与读取灵活性 A 写入受限、读取灵活 B 不能写入 C 只能读具体类型 D ? super T 可写 T 及子类,读取只能 Object(写入灵活、读取受限),符合"消费者 super" ✓ 正确答案
# 38. 两个泛型重载经类型擦除后签名相同为何无法共存,修改返回类型能否解决这种冲突 A 擦除后参数签名相同冲突,返回类型不参与签名且 Java 不允许仅返回类型不同的重载,需改方法名/参数 ✓ 正确答案 B 返回类型参与签名 C 改返回类型可解决 D 擦除冲突可共存
# 39. 交叉类型上界如何同时约束父类和多个接口,类型变量声明时为什么父类必须排在最前 A 类上界可放任意位置 B 可有多个类上界 C 接口只能一个 D 交叉类型上界用 & 同时约束父类与多个接口,父类必须排最前(单继承一个类上界,接口可多个) ✓ 正确答案
# 40. 原始类型(Raw Type)与泛型类型的兼容性陷阱 A raw type 与泛型混用产生 unchecked 警告与潜在运行时 CCE,应始终参数化并迁移遗留代码 ✓ 正确答案 B raw type 与泛型混用类型安全 C raw type 无警告 D 混用不会 CCE
# 41. 反射获取 Class 对象的三种途径与性能影响 A .class 最慢 B getClass 触发初始化 C forName 最快 D .class 编译期常量最轻、getClass() 运行时快速、forName 需字符串加载可能初始化最慢 ✓ 正确答案
# 42. 反射调用方法与构造器的性能开销与 setAccessible A 反射与直接调用一样快 B 反射有查找/装箱/访问检查开销且难内联,setAccessible 跳过检查提速,热路径用 MethodHandle 或缓存 ✓ 正确答案 C setAccessible 使反射与直接调用相同 D 反射可被 JIT 内联
# 43. 哪些类型属于可具体化类型,为什么可以检查 instanceof List<?> 却不能检查 List<String> A 可具体化类型含 List<?>/原始类型/非泛型,List<String> 不可具体化,instanceof 只能检查可具体化类型 ✓ 正确答案 B instanceof 可检查 List<String> C 类型变量可具体化 D List<String> 可具体化
# 44. 泛型 record 的规范构造器如何校验组件不变式,静态成员为何不能引用 record 的类型参数 A 构造器可校验组件不变式,静态成员属于类级不能引用实例级类型参数 T ✓ 正确答案 B 静态成员可引用类型参数 C 类型参数是类级 D 静态成员可用 T
# 45. 泛型与数组协变的兼容性问题 A 泛型也是协变 B 数组协变(运行时检查)但泛型不变,泛型数组因擦除+协变不安全被禁止,用集合替代 ✓ 正确答案 C 泛型数组合法 D List<String> 是 List<Object> 子类型
# 46. 泛型接口实现时的桥接方法(Bridge Method) A 桥接方法是手写的 B 桥接方法无意义 C 桥接方法用于类型擦除前的签名 D 桥接方法是编译器在擦除后生成的合成方法,使接口/父类的 Object 方法正确分派到具体类型方法,保持多态 ✓ 正确答案
# 47. 泛型数组为何不能直接创建(new T[]) A new T[] 合法 B 擦除后无法确定元素类型且数组协变不安全,new T[] 被禁止,用 List<T> 或强转 Object[] 替代 ✓ 正确答案 C 泛型数组与普通数组相同 D new T[] 类型安全
# 48. 泛型方法、泛型类与类型推断的边界 A 泛型类无需指定类型 B 泛型方法需实例化指定类型 C 泛型方法无推断 D 泛型方法调用时推断、泛型类实例化指定,类型推断受上下文约束,复杂场景需显式类型参数 ✓ 正确答案
# 49. 泛型类为什么不能直接或间接继承 Throwable,catch 子句又为何不能捕获类型变量 A 泛型类可继承 Throwable B 泛型擦除后无法精确匹配异常类型,泛型类不能继承 Throwable,catch 需具体化类型不能捕获类型变量 ✓ 正确答案 C catch 可捕获类型变量 D 异常类可泛型
# 50. 泛型类的静态成员为何不能使用类类型参数,其限制的根因与规避方式是什么? A 类型参数是实例级,静态成员类级无 T 故不能用,规避:静态方法用方法级类型参数 ✓ 正确答案 B 类型参数是类级 C 静态成员可使用类型参数 D 静态字段可用 T
# 51. 注解处理器(APT/KAPT/KSP)的发展 A KSP 比 KAPT 慢 B APT 只在运行时 C Java 用标准 APT,Kotlin 用 KAPT(桥接 Java 处理器)或 KSP(直接符号处理,更快) ✓ 正确答案 D KAPT 直接处理 Kotlin 符号
# 52. 注解的保留策略(SOURCE/CLASS/RUNTIME)与读取机制 A CLASS 运行时可反射 B SOURCE 保留到运行时 C RUNTIME 可反射读取,CLASS 保留在字节码(工具/处理器读取),SOURCE 仅源码,按读取需求选择 ✓ 正确答案 D 所有注解都运行时读取
# 53. 类型推断在链式调用与方法引用(Method Reference) A 链式调用无推断 B 方法引用无需预测 C 链式调用与方法引用都靠目标类型推断,受赋值/参数/返回上下文约束,复杂场景需显式类型 ✓ 正确答案 D 推断总是自动成功
# 54. 类型擦除后如何通过反射获取泛型信息 A 运行时完全无泛型可获取 B class 文件 signature 属性保留泛型签名,反射 getGenericXxx 读取并解析为 Type(ParameterizedType 等) ✓ 正确答案 C getGenericType 返回 Class D 泛型信息无法反射
# 55. 类型擦除(Type Erasure)在桥接方法(Bridge Method) A 桥接方法由运行期生成 B 桥接方法用于擦除前 C 擦除后签名变化,桥接方法桥接 Object 签名到具体类型方法,保持多态分派正确 ✓ 正确答案 D 桥接方法不影响多态
# 56. 设计只读生产者和可写消费者 API 时,如何应用 PECS 又避免返回类型被通配符污染 A 返回类型应通配符 B 返回类型用通配符更灵活 C 通配符只用于返回 D PECS 用通配符修饰参数(生产 extends、消费 super),返回类型避免通配符污染(用具体类型或辅助方法) ✓ 正确答案
# 57. 通配符 ?、? extends T、? super T 的 PECS 原则 A ? extends 可写 B PECS:生产者用 ? extends T(可读)、消费者用 ? super T(可写),无界 ? 任意类型只读 ✓ 正确答案 C ? super 可读具体类型 D ? extends 可写任意值
# 58. 链式泛型方法调用发生目标类型推断时,赋值上下文、参数上下文和返回值如何共同约束类型 A 推断只由赋值上下文决定 B 赋值、参数、返回上下文联合约束推断,Lambda 是 poly expression 受目标类型决定,冲突时显式指定 ✓ 正确答案 C 推断总是成功 D 参数上下文无关
# 59. JDK 25 中 JSpecify(null-safety 注解) A JSpecify 是 JDK 内建语法 B JSpecify 无工具支持 C JSpecify 只用于运行时 D JSpecify 提供标准空值注解(@Nullable/@NonNull),供静态分析工具进行空值安全分析 ✓ 正确答案
# 60. JDK 25 原始类型与未检查警告的演进 A 警告可忽略 B JDK 25 移除 raw type C raw type 无警告 D JDK 25 强化 raw type 的 unchecked 警告提示,推动迁移到参数化类型,但保留旧代码兼容 ✓ 正确答案
# 61. JEP 483(AOT Class Loading & Linking) A JEP 483 是运行时优化 B JEP 483 只影响编译 C JEP 483 提前进行类加载与链接(AOT)减少启动开销,配合 CDS 优化启动性能 ✓ 正确答案 D JEP 483 与启动无关
# 62. JEP 484 与 ASM/Javassist 的关系(标准 vs 第三方) A JEP 484 替代 ASM B ASM 是 JDK 标准 C JEP 484 是 JDK 标准类文件 API,ASM/Javassist 是第三方库,JEP 484 提供标准选项减少 JDK 对第三方依赖 ✓ 正确答案 D JEP 484 与字节码无关
# 63. JEP 484 在框架(Spring/Hibernate)二次开发中的潜在应用 A 框架一定用 ASM B JEP 484 只能 JDK 内部用 C 框架可用 JEP 484 生成/解析字节码(代理/增强),减少对第三方 ASM 依赖,获得标准稳定 API ✓ 正确答案 D 框架无法用 JEP 484
# 64. Java 24+ Class-File API(JEP 484) A 它是运行时 API B JEP 484 是 JDK 标准 Class-File API,类型化解析/生成 class 文件,Java 24 预览特性 ✓ 正确答案 C 它只生成不解析 D 它是第三方库
# 65. Java SPI(ServiceLoader)机制的工作原理及其与 Spring SPI(SpringFactoriesLoader)的差异 A 两者用相同配置文件 B Spring SPI 用 services 文件 C ServiceLoader 用 META-INF/services/<接口>,SpringFactoriesLoader 用 META-INF/spring.factories 多条目,都是 SPI 扩展机制 ✓ 正确答案 D ServiceLoader 用 spring.factories
# 66. MethodHandle.Lookup.defineClass 在 JDK 25 的可访问性 A 生成的类可访问任意类 B 生成类无访问权限 C 可跨模块随意定义 D 生成的类继承 Lookup 的访问上下文(可访问 Lookup 类成员),受模块/包边界限制 ✓ 正确答案