获取 Class 对象有哪些方式?有什么边界?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
常见方式包括类型字面量 Type.class、对象的 getClass()、按名字调用 Class.forName,以及使用指定 ClassLoader 的加载方法。它们取得的信息和副作用不同:getClass 反映实际运行类型,类字面量可表达基本类型,而常用 forName 还会要求初始化对应类。
讲清原理
Type.class 不需要先 new 一个实例,也不因为取类字面量就要求初始化该类型。getClass 需要一个非 null 对象,因此对 null 调用会失败。按名字加载时,还需要正确的二进制名称与合适的类加载器。
同名类由不同定义类加载器加载,可能对应不同 Class 对象,所以不能只凭名称判断运行时类型相同。泛型擦除后,也不能用 List<String>.class 直接表示某个参数化类型的类字面量。
例子与易错点
Object value = "hello";
Class<?> literal = String.class;
Class<?> runtime = value.getClass();
Class<?> named = Class.forName("java.lang.String");
System.out.println(literal == runtime && runtime == named); // true
System.out.println(int.class.isPrimitive()); // true
value 的声明类型是 Object,但 getClass 返回 String 的运行时类型。默认 loadClass 通常不因该调用而初始化目标类;需要精确控制初始化时,按具体 API 契约选择,而不是把所有取 Class 的写法视为完全等价。
相关题:第 12 题、第 28 题、第 33 题、第 49 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。