Java В чем разница между каноническим именем, простым именем и именем класса?

obj.getClass().getSimpleName();
obj.getClass().getName();
obj.getClass().getCanonicalName();

В чем разница между каноническим именем, простым именем и именем класса ?

Для понятия разницы сперва нужно рассмотреть данный пример:

//примитивный тип
System.out.println(int.class.getName());
System.out.println(int.class.getCanonicalName());
System.out.println(int.class.getSimpleName());

//класс
System.out.println(String.class.getName());
System.out.println(String.class.getCanonicalName());
System.out.println(String.class.getSimpleName());

//внутренний класс
System.out.println(HashMap.SimpleEntry.class.getName());
System.out.println(HashMap.SimpleEntry.class.getCanonicalName());
System.out.println(HashMap.SimpleEntry.class.getSimpleName());        

//анонимный внутренний класс
System.out.println(new Serializable(){}.getClass().getName());
System.out.println(new Serializable(){}.getClass().getCanonicalName());
System.out.println(new Serializable(){}.getClass().getSimpleName());

Результат вывода:

int
int
int
java.lang.String
java.lang.String
String
java.util.AbstractMap$SimpleEntry
java.util.AbstractMap.SimpleEntry
SimpleEntry
ClassnameTest$1
null
// вернул пустую строку

имя - это имя, которое вы бы использовали для динамической загрузки класса.

каноническое имя - это имя, которое будет использоваться в операторе импорта и однозначно идентифицирует класс.

простое имя слабо идентифицирует класс.

Каноническое и простое имя может быть полезно во время использования toString.

1 Симпатия