Java中获取Class对象有三种方式:类名.class、对象.getClass()、Class.forName(),均返回同一实例;获取后可查名称、继承关系、成员、注解及泛型等元数据。

Java 中通过 Class 类获取类信息,核心是先获得该类的 Class 对象,再调用其方法读取字段、方法、构造器、注解、父类、接口等元数据。关键在于“怎么拿到 Class 对象”以及“拿到后能查什么”。
三种常用方式获取 Class 对象
同一个类在 JVM 中只有一个 Class 实例,无论用哪种方式获取,结果都相等(== 为 true):
-
类名.class:最简洁安全,编译期就校验类是否存在,推荐用于已知类名的场景。
例如:String.class、List.class -
对象.getClass():适用于已有实例,注意 null 会抛
NullPointerException。
例如:"hello".getClass()返回String.class -
Class.forName("全限定类名"):动态加载类,触发类初始化(执行 static 块),需处理
ClassNotFoundException。
例如:Class.forName("java.util.ArrayList")
用 Class 对象读取基础类结构
拿到 Class 对象后,可直接查询类的静态结构信息:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
getName():返回全限定名(如"java.lang.String") -
getSimpleName():返回简单名(如"String") -
getSuperclass():返回父类的Class对象(Object的父类为null) -
getInterfaces():返回直接实现的接口数组(不包含父接口) -
isInterface()、isEnum()、isArray()等:判断类型特征
获取成员(字段、方法、构造器)
反射提供两套方法:带 Declared 的只查本类声明的成员(含 private),不查继承的;不带的则只查 public 成员(含继承的):
立即学习“Java免费学习笔记(深入)”;
-
字段:
getDeclaredFields()(全部字段)、getField("name")(public 字段,含父类) -
方法:
getDeclaredMethods()、getMethod("toString")(需传参类型,如String.class) -
构造器:
getDeclaredConstructors()、getConstructor(String.class, int.class) - 对任意成员调用
setAccessible(true)可绕过访问控制,访问 private 成员(需 SecurityManager 允许)
读取注解和泛型信息
Class 和它的成员都支持反射获取注解与泛型:
-
getAnnotations()或getAnnotation(Override.class)获取运行时注解 -
getTypeParameters()获取类声明的泛型参数(如class Box<t></t>中的T) -
getGenericSuperclass()返回带实际泛型的父类类型(如ArrayList<string></string>的父类是List<string></string>)

















