摘录 待整理

参考文章: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(); }

  1. private static void x(Runnable r) {
  2. showClass(r.getClass());
  3. showClass(java.lang.reflect.Array.newInstance(r.getClass(), 1).getClass()); // Obtains an array class of a lambda base type.
  4. }
  5. public static class NestedClass {}
  6. public class InnerClass {}
  7. public static void main(String[] args) {
  8. class LocalClass {}
  9. showClass(void.class);
  10. showClass(int.class);
  11. showClass(String.class);
  12. showClass(Runnable.class);
  13. showClass(SomeEnum.class);
  14. showClass(SomeAnnotation.class);
  15. showClass(int[].class);
  16. showClass(String[].class);
  17. showClass(NestedClass.class);
  18. showClass(InnerClass.class);
  19. showClass(LocalClass.class);
  20. showClass(LocalClass[].class);
  21. Object anonymous = new java.io.Serializable() {};
  22. showClass(anonymous.getClass());
  23. showClass(java.lang.reflect.Array.newInstance(anonymous.getClass(), 1).getClass()); // Obtains an array class of an anonymous base type.
  24. x(() -> {});
  25. }

}

enum SomeEnum { BLUE, YELLOW, RED; }

@interface SomeAnnotation {}

  1. <a name="4rZej"></a>
  2. ### 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; ```