文章目录467. Java 反射 - 类的 getTypeName() 与 getName()1. getTypeName()示例代码输出结果2. getName()示例代码输出结果3. 四种名称方法对比4. 总结467. Java 反射 - 类的 getTypeName() 与 getName()在反射 API 中除了Simple Name简单名和Canonical Name规范名还有另外两种方式获取类的名字getTypeName()getName()它们在大多数情况下结果一致但在匿名类、lambda、数组这类特殊情况里差异明显。1.getTypeName()定义Java SE 8 在Type接口中引入的方法返回该类的“类型名”。特征始终有值即使是匿名类和 lambda也会返回编译器生成的类名。示例代码importjava.util.function.Supplier;publicclassTypeNameDemo{publicstaticvoidmain(String[]args){// 普通类Class?c1String.class;System.out.println(Type name: c1.getTypeName());// 匿名类ObjectkeynewObject(){};Class?c2key.getClass();System.out.println(Type name: c2.getTypeName());// LambdaSupplierStringsupplier()-Hello;Class?c3supplier.getClass();System.out.println(Type name: c3.getTypeName());}}输出结果Typename:java.lang.StringTypename:org.devjava.Main$1Typename:org.devjava.Main$$Lambda/0x00000275a0003748✅说明String→ 正常类 → 完整类名java.lang.String匿名类 → 有一个编译器生成的名字Main$1Lambda → 有一个自动生成的名字Main$$Lambda/...与getCanonicalName()不同的是匿名类和 lambda 有 type name但 canonical name 返回 null。2.getName()定义返回类、接口、数组、基本类型或void的名称。区别对于普通类等同于getTypeName()对于数组结果不同示例代码String[]arrnewString[5];System.out.println(Type name: arr.getClass().getTypeName());System.out.println(Name: arr.getClass().getName());int[][]numsnewint[3][4];System.out.println(Type name: nums.getClass().getTypeName());System.out.println(Name: nums.getClass().getName());输出结果Typename:java.lang.String[]Name:[Ljava.lang.String;Typename:int[][]Name:[[I✅说明getTypeName()→ 更人类可读接近源码里的写法 (String[],int[][])getName()→ 返回 JVM 内部使用的“描述符”形式如[I表示int[][Ljava.lang.String;表示String[]3. 四种名称方法对比方法普通类匿名类Lambda数组getSimpleName()StringMain$$Lambda/...String[]getCanonicalName()java.lang.Stringnullnulljava.lang.String[]getTypeName()java.lang.StringMain$1Main$$Lambda/...java.lang.String[]getName()java.lang.StringMain$1Main$$Lambda/...[Ljava.lang.String;/[[I4. 总结getTypeName()始终有值匿名类和 lambda 也能获取对数组 → 返回源码风格的类型名getName()普通类等同于getTypeName()对数组 → 返回JVM 内部描述符不太友好但在框架底层很常见口诀展示/日志用 →getCanonicalName()或getTypeName()调试/JVM 底层开发用 →getName()
467. Java 反射 - 类的 getTypeName() 与 getName()
文章目录467. Java 反射 - 类的 getTypeName() 与 getName()1. getTypeName()示例代码输出结果2. getName()示例代码输出结果3. 四种名称方法对比4. 总结467. Java 反射 - 类的 getTypeName() 与 getName()在反射 API 中除了Simple Name简单名和Canonical Name规范名还有另外两种方式获取类的名字getTypeName()getName()它们在大多数情况下结果一致但在匿名类、lambda、数组这类特殊情况里差异明显。1.getTypeName()定义Java SE 8 在Type接口中引入的方法返回该类的“类型名”。特征始终有值即使是匿名类和 lambda也会返回编译器生成的类名。示例代码importjava.util.function.Supplier;publicclassTypeNameDemo{publicstaticvoidmain(String[]args){// 普通类Class?c1String.class;System.out.println(Type name: c1.getTypeName());// 匿名类ObjectkeynewObject(){};Class?c2key.getClass();System.out.println(Type name: c2.getTypeName());// LambdaSupplierStringsupplier()-Hello;Class?c3supplier.getClass();System.out.println(Type name: c3.getTypeName());}}输出结果Typename:java.lang.StringTypename:org.devjava.Main$1Typename:org.devjava.Main$$Lambda/0x00000275a0003748✅说明String→ 正常类 → 完整类名java.lang.String匿名类 → 有一个编译器生成的名字Main$1Lambda → 有一个自动生成的名字Main$$Lambda/...与getCanonicalName()不同的是匿名类和 lambda 有 type name但 canonical name 返回 null。2.getName()定义返回类、接口、数组、基本类型或void的名称。区别对于普通类等同于getTypeName()对于数组结果不同示例代码String[]arrnewString[5];System.out.println(Type name: arr.getClass().getTypeName());System.out.println(Name: arr.getClass().getName());int[][]numsnewint[3][4];System.out.println(Type name: nums.getClass().getTypeName());System.out.println(Name: nums.getClass().getName());输出结果Typename:java.lang.String[]Name:[Ljava.lang.String;Typename:int[][]Name:[[I✅说明getTypeName()→ 更人类可读接近源码里的写法 (String[],int[][])getName()→ 返回 JVM 内部使用的“描述符”形式如[I表示int[][Ljava.lang.String;表示String[]3. 四种名称方法对比方法普通类匿名类Lambda数组getSimpleName()StringMain$$Lambda/...String[]getCanonicalName()java.lang.Stringnullnulljava.lang.String[]getTypeName()java.lang.StringMain$1Main$$Lambda/...java.lang.String[]getName()java.lang.StringMain$1Main$$Lambda/...[Ljava.lang.String;/[[I4. 总结getTypeName()始终有值匿名类和 lambda 也能获取对数组 → 返回源码风格的类型名getName()普通类等同于getTypeName()对数组 → 返回JVM 内部描述符不太友好但在框架底层很常见口诀展示/日志用 →getCanonicalName()或getTypeName()调试/JVM 底层开发用 →getName()