摘录 待整理
参考文章:https://www.codenong.com/15202997/
getName():
- 每个非lambda和非数组的类或接口(即顶级、嵌套、内部、本地和匿名)都有一个名称(由getName()返回),即包名后接一个点(如果有包),然后接编译器生成的类文件名(不含后缀.class)。如果没有包,它只是类文件的名称。如果类是内部、嵌套、本地或匿名类,编译器应在其类文件名中至少生成一个$。注意,对于匿名类,类名将以美元符号结尾,后面跟一个数字。
- lambda类名通常是不可预测的,您无论如何都不应该关心它们。确切地说,它们的名称是封闭类的名称,后跟$$Lambda$,后跟一个数字,后跟一个斜杠,后跟另一个数字。
- 对于数组类,getName()方法返回其类描述符。此规则似乎只适用于组件类型为lambda的数组类(可能是bug),但希望这无论如何都不重要,因为即使存在组件类型为lambda的数组类也没有意义。
原语的类描述符为:Z为boolean的Z为boolean的B为edcx1〔11〕的S为edcx1〔13〕的S为edcx1〔13〕的C为edcx1〔15〕的edcx1〔14〕为edcx1〔16〕为edcx1〔17〕的edcx1〔18〕为edcx1〔19〕的edcx1〔8〕为edcx1〔18〕为edcx1〔19〕的edcx11〔19〕的edcx1〔20〕为edcx1〔20〕为edcx1〔20〕为edcx1〔20〕1〔20〕为edcx1〔20〕21〕和D表示double。对于非数组类和接口,类描述符是L,后面是getName()给出的,后面是;。对于数组类,类描述符是[,后跟组件类型的类描述符(它本身可能是另一个数组类)。——待整理
getCanonicalName():
对于顶级类和接口,getCanonicalName()方法返回的只是getName()方法返回的内容。
- 对于匿名类或本地类以及这些类的数组类,getCanonicalName()方法返回null。
- 对于内部和嵌套类和接口,getCanonicalName()方法返回getName()方法将用点替换编译器引入的美元符号。
对于数组类,如果组件类型的规范名称是null,则getCanonicalName()方法返回null。否则,它返回组件类型的规范名称,后跟[]。
getSimpleName():
对于顶级、嵌套、内部和本地类,getSimpleName()返回在源文件中写入的类的名称。
- 对于匿名类,getSimpleName()返回一个空的String。
- 对于lambda类,getSimpleName()只返回没有包名称的getName()将返回的内容。对于我来说,这没有多大意义,看起来像一个bug,但是在lambda类上调用getSimpleName()是没有意义的。
- 对于数组类,getSimpleName()方法返回组件类的简单名称,后跟[]。这有一个有趣/奇怪的副作用,即组件类型为匿名类的数组类只使用[]作为它们的简单名称。
toString():
如果类实例表示接口(或注释,这是一种特殊类型的接口),那么toString()返回”interface” + getName()。如果它是原语,它只返回getName()。如果它是其他类型(类类型,即使它很奇怪),则返回”class” + getName()。Example:
```java package com.example;
public final class TestClassNames { private static void showClass(Class<?> c) { System.out.println(“getName(): “ + c.getName()); System.out.println(“getCanonicalName():” + c.getCanonicalName()); System.out.println(“getSimpleName(): “ + c.getSimpleName()); System.out.println(“toString(): “ + c.toString()); System.out.println(); }
private static void x(Runnable r) {
showClass(r.getClass());
showClass(java.lang.reflect.Array.newInstance(r.getClass(), 1).getClass()); // Obtains an array class of a lambda base type.
}
public static class NestedClass {}
public class InnerClass {}
public static void main(String[] args) {
class LocalClass {}
showClass(void.class);
showClass(int.class);
showClass(String.class);
showClass(Runnable.class);
showClass(SomeEnum.class);
showClass(SomeAnnotation.class);
showClass(int[].class);
showClass(String[].class);
showClass(NestedClass.class);
showClass(InnerClass.class);
showClass(LocalClass.class);
showClass(LocalClass[].class);
Object anonymous = new java.io.Serializable() {};
showClass(anonymous.getClass());
showClass(java.lang.reflect.Array.newInstance(anonymous.getClass(), 1).getClass()); // Obtains an array class of an anonymous base type.
x(() -> {});
}
}
enum SomeEnum { BLUE, YELLOW, RED; }
@interface SomeAnnotation {}
<a name="4rZej"></a>
### Output
getName(): void getCanonicalName(): void getSimpleName(): void toString(): void
getName(): int getCanonicalName(): int getSimpleName(): int toString(): int
getName(): java.lang.String getCanonicalName(): java.lang.String getSimpleName(): String toString(): class java.lang.String
getName(): java.lang.Runnable getCanonicalName(): java.lang.Runnable getSimpleName(): Runnable toString(): interface java.lang.Runnable
getName(): com.example.SomeEnum getCanonicalName(): com.example.SomeEnum getSimpleName(): SomeEnum toString(): class com.example.SomeEnum
getName(): com.example.SomeAnnotation getCanonicalName(): com.example.SomeAnnotation getSimpleName(): SomeAnnotation toString(): interface com.example.SomeAnnotation
getName(): [I getCanonicalName(): int[] getSimpleName(): int[] toString(): class [I
getName(): [Ljava.lang.String; getCanonicalName(): java.lang.String[] getSimpleName(): String[] toString(): class [Ljava.lang.String;
getName(): com.example.TestClassNames$NestedClass getCanonicalName(): com.example.TestClassNames.NestedClass getSimpleName(): NestedClass toString(): class com.example.TestClassNames$NestedClass
getName(): com.example.TestClassNames$InnerClass getCanonicalName(): com.example.TestClassNames.InnerClass getSimpleName(): InnerClass toString(): class com.example.TestClassNames$InnerClass
getName(): com.example.TestClassNames$1LocalClass getCanonicalName(): null getSimpleName(): LocalClass toString(): class com.example.TestClassNames$1LocalClass
getName(): [Lcom.example.TestClassNames$1LocalClass; getCanonicalName(): null getSimpleName(): LocalClass[] toString(): class [Lcom.example.TestClassNames$1LocalClass;
getName(): com.example.TestClassNames$1
getCanonicalName(): null
getSimpleName():
toString(): class com.example.TestClassNames$1
getName(): [Lcom.example.TestClassNames$1; getCanonicalName(): null getSimpleName(): [] toString(): class [Lcom.example.TestClassNames$1;
getName(): com.example.TestClassNames$$Lambda$1/1175962212 getCanonicalName(): com.example.TestClassNames$$Lambda$1/1175962212 getSimpleName(): TestClassNames$$Lambda$1/1175962212 toString(): class com.example.TestClassNames$$Lambda$1/1175962212
getName(): [Lcom.example.TestClassNames$$Lambda$1; getCanonicalName(): com.example.TestClassNames$$Lambda$1/1175962212[] getSimpleName(): TestClassNames$$Lambda$1/1175962212[] toString(): class [Lcom.example.TestClassNames$$Lambda$1; ```