class.getname()返回jvm内部实体名(如com.example.user、com.example.outer$inner、[ljava.lang.string;),getsimplename()返回源码类名片段(如user、inner、string[]),gettypename()返回贴近java语法的类型描述(如com.example.user、com.example.outer.inner、java.lang.string[])。

Class.getName() 返回 JVM 内部使用的“实体名称”
这个方法返回的是类在 JVM 中的运行时标识名,遵循 JVM 规范,不是 Java 源码意义上的“可读名”。关键特点包括:
- 普通类:带完整包路径,如 com.example.User
- 内部类:用 $ 连接,如 com.example.Outer$Inner
- 数组类:以 [ 开头,维度越多左括号越多,元素类型用 JNI 签名缩写,如 [Ljava.lang.String; 表示 String[]
- 基本类型:直接返回小写名称,如 int、boolean
- void:返回 void
Class.getSimpleName() 返回源码中写的“类名片段”
它只提取开发者在源文件里定义的类名部分,完全忽略包名和嵌套结构,适合日志或 UI 显示等对可读性要求高但不需唯一性的场景:
- 普通类:如 User
- 内部类:仅返回自身名字,如 Inner(不体现 Outer)
- 匿名类:返回空字符串 ""
- 数组类:返回 String[]、int[] 这类带方括号的形式
- 基本类型:仍为 int、boolean 等
Class.getTypeName() 返回“类型描述字符串”
这是 Java 8 引入的方法,语义上更接近“这个类型在代码里怎么写”,对泛型、数组、内部类等有更贴近 Java 语法的表达:
- 普通类:与 getCanonicalName() 一致,如 com.example.User
- 内部类:使用点号分隔(非 $),如 com.example.Outer.Inner
- 数组类:用标准 Java 语法,如 com.example.User[]
- 泛型类型(如 List
):getTypeName() 可能保留泛型信息(取决于 Class 对象来源,反射获取的泛型类型擦除后可能不体现) - 匿名类:返回类似 com.example.Outer$1 的 JVM 名,与 getName() 相同
三者典型对比示例
假设有一个类 com.example.service.UserService,其内部定义了一个静态内部类 Worker:
- UserService.class.getName() → com.example.service.UserService
- UserService.class.getSimpleName() → UserService
- UserService.class.getTypeName() → com.example.service.UserService
- UserService.Worker.class.getName() → com.example.service.UserService$Worker
- UserService.Worker.class.getSimpleName() → Worker
- UserService.Worker.class.getTypeName() → com.example.service.UserService.Worker
- String[].class.getName() → [Ljava.lang.String;
- String[].class.getSimpleName() → String[]
- String[].class.getTypeName() → java.lang.String[]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











