java反射获取class对象有三种方式:类名.class(安全且不初始化)、对象.getclass()(支持多态)、class.forname("全限定名")(动态加载并触发初始化);之后可读取类结构、字段、方法、构造器等信息,并通过setaccessible(true)访问私有成员。

Java 反射机制在运行时获取类信息,核心是通过 Class 对象访问类的元数据。它不依赖编译期类型,只要类已加载进 JVM,就能“自省”出完整结构。
怎么拿到 Class 对象
这是所有反射操作的前提,有三种常用方式:
-
类名.class:编译期已知类型时最安全,不触发类初始化,例如
User.class -
对象.getClass():已有实例时使用,返回运行时实际类型(支持多态),例如
new User().getClass() -
Class.forName("全限定类名"):用字符串动态加载,会执行静态代码块(即触发类初始化),适合配置驱动或插件场景,例如
Class.forName("com.example.User")
怎么读取类的基本结构
拿到 Class 对象后,可直接调用方法获取基本信息:
-
getName()返回全限定类名(如"com.example.User") -
getSimpleName()返回简单类名(如"User") -
getSuperclass()获取直接父类(返回另一个Class对象) -
getInterfaces()返回该类实现的所有接口数组 -
getModifiers()返回修饰符整数,配合Modifier.toString()转成可读字符串(如"public final")
怎么获取字段、方法和构造器
关键区分在于“是否包含继承”和“是否只限 public”:
-
字段:
getDeclaredFields()返回本类所有字段(含 private),getFields()只返回本类及父类的 public 字段 -
方法:
getDeclaredMethods()返回本类全部方法(含 private),getMethods()只返回本类及父类的 public 方法 -
构造器:
getDeclaredConstructors()返回本类所有构造器(含 private),getConstructors()仅返回 public 构造器 - 若要访问私有成员,必须先调用
setAccessible(true)绕过访问控制
注意类加载与初始化时机
反射本身不参与类加载过程,而是依赖已加载完成的 Class 对象。但不同获取方式对初始化的影响不同:
-
Class.forName()会触发类初始化(执行静态块) -
类名.class和ClassLoader.loadClass()仅加载类,不初始化 -
对象.getClass()意味着对象已创建,所以类早已初始化完毕
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











