
文章目录455. Java 反射 - 核心 Class 类1. 什么是 Class 类2. 获取 Class 对象的三种标准方式代码示例3. 不同类型的 Class 表现4. ClassLoader类的加载器加载器层级示例代码5. 总结455. Java 反射 - 核心 Class 类1. 什么是 Class 类在 Java 中java.lang.Class是反射机制的入口。类型的镜子每个类加载到 JVM 后都会产生一个唯一的Class对象。它描述了该类的结构成员变量、方法、构造器、父类等。万物皆有 Class不仅是普通的类接口、枚举、数组、基本类型如int.class、甚至 Lambda 表达式和匿名类在 JVM 中都有对应的Class实例。单例性对于同一个类JVM 只会创建一个Class实例。2. 获取 Class 对象的三种标准方式方式语法适用场景通过对象实例obj.getClass()已有对象实例想知道它的运行时实际类型。通过类字面量ClassName.class编译期已知类名最安全、性能最高的方式。通过类名字符串Class.forName(全类名)编译期不知道类名运行时动态加载如从配置文件读取。代码示例// 1. getClass()总是返回实际运行时的类型ListStringlistnewArrayList();System.out.println(list.getClass());// class java.util.ArrayList// 2. 类字面量Class?c1String.class;Class?c2int.class;// 基本类型也可以// 3. 动态加载 (需要处理异常)Class?c3Class.forName(java.util.Scanner);3. 不同类型的 Class 表现反射不仅限于普通类看看其他特殊类型在“镜子”里的样子数组 (Arrays)内部名由[和类型缩写组成。byte[]bytesnewbyte[10];System.out.println(bytes.getClass());// class [B (B代表byte)枚举 (Enums)返回的是整个枚举类型的定义。enumColor{RED,BLUE}System.out.println(Color.RED.getClass());// class Color匿名内部类由编译器自动生成命名格式通常为外部类$数字。RunnablernewRunnable(){Overridepublicvoidrun(){}};System.out.println(r.getClass());// class Main$1Lambda 表达式由 JVM 在运行时动态生成的匿名类通常不建议依赖其类名。4. ClassLoader类的加载器每一个Class对象内部都持有一个对ClassLoader的引用负责将字节码文件加载到内存中。加载器层级Bootstrap ClassLoader (启动类加载器)加载 JDK 核心库如java.lang.*。在代码中通常返回null。Platform/Extension ClassLoader (扩展类加载器)加载标准扩展库。App/System ClassLoader (应用类加载器)加载我们自己编写的类和第三方 Jar 包。示例代码// JDK 核心类由 Bootstrap 加载返回 nullSystem.out.println(String.class.getClassLoader());// 自定义类由 AppClassLoader 加载System.out.println(MyClass.class.getClassLoader());5. 总结入口点所有反射操作获取字段、调用方法都必须先拿到Class对象。动态性Class.forName()是实现插件化和框架解耦的关键。唯一性无论你用哪种方式获取同一个类的Class对象在内存中只有一个。泛型擦除注意ListString.class是不存在的反射只能拿到原始类型List.class。