Class 获取四种名字


当我们想要获取一个类的名字的时候, 我们能获得它的四个名字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package wang.yu66.javase.basic;

import java.util.function.BiConsumer;

public class Print4WayInnerClassName {

public static void main(String[] args) {
System.out.println(Print4WayInnerClassName.class.getName());
System.out.println(Print4WayInnerClassName.class.getSimpleName());
System.out.println(Print4WayInnerClassName.class.getTypeName());
System.out.println(Print4WayInnerClassName.class.getCanonicalName());

System.out.println("*************************************************");

System.out.println(InnerA.class.getName());
System.out.println(InnerA.class.getSimpleName());
System.out.println(InnerA.class.getTypeName());
System.out.println(InnerA.class.getCanonicalName());

System.out.println("*************************************************");

int[] array = new int[0];
System.out.println(array.getClass().getName());
System.out.println(array.getClass().getSimpleName());
System.out.println(array.getClass().getTypeName());
System.out.println(array.getClass().getCanonicalName());

System.out.println("*************************************************");
BiConsumer biConsumer = (a, b) -> {};
System.out.println(biConsumer.getClass().getName());
System.out.println(biConsumer.getClass().getSimpleName());
System.out.println(biConsumer.getClass().getTypeName());
System.out.println(biConsumer.getClass().getCanonicalName());
}

interface InnerA {}
}

输出如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
wang.yu66.javase.basic.Print4WayInnerClassName
Print4WayInnerClassName
wang.yu66.javase.basic.Print4WayInnerClassName
wang.yu66.javase.basic.Print4WayInnerClassName
*************************************************
wang.yu66.javase.basic.Print4WayInnerClassName$InnerA
InnerA
wang.yu66.javase.basic.Print4WayInnerClassName$InnerA
wang.yu66.javase.basic.Print4WayInnerClassName.InnerA
*************************************************
[I
int[]
int[]
int[]
*************************************************
wang.yu66.javase.basic.Print4WayInnerClassName$$Lambda$1/2093631819
Print4WayInnerClassName$$Lambda$1/2093631819
wang.yu66.javase.basic.Print4WayInnerClassName$$Lambda$1/2093631819
wang.yu66.javase.basic.Print4WayInnerClassName$$Lambda$1/2093631819

那这四种名字都有什么不同呢?

  • getName() : 当要动态加载一个类的时候, 那么应该使用这个方法获得的名字(例如使用Class.forName())
  • getSimpleName() : 这个方法返回的类的类名, 但是并不会带有全限定名, 也就是不带有包名
  • getCanonicalName() : 这个方法会返回一个类的全限定名, 和getName()类似. 但是需要注意的是, 当使用内部类的时候getName返回的是$, 而getCanoicalName返回的是. . 这个方法只是适用于输出类名, 可以唯一标示一个类, 但是千万不要用这个方法做类的动态加载之类的事情