В чем разница между Class.getName()
и Class.getCanonicalName()
в Java?
В чем разница между Name и CanonicalName?
comment
См. также stackoverflow.com/questions/15202997/
- person Anurag Sharma   schedule 17.12.2013
comment
@ Ануш, смешно, я не видел этого, когда искал, он всего на месяц старше моего. Спасибо
- person durron597   schedule 17.12.2013
Ответы (1)
Рассмотрим следующую программу:
package org.test.stackoverflow;
public class CanonicalName {
public static void main(String[] args) {
CanonicalName cn = new CanonicalName();
cn.printClassNames();
}
private Anonymous anony;
private MyAnony myAnony;
public CanonicalName() {
anony = new Anonymous() {
public void printInterface() {
System.out.println("Anony Name: " + getClass().getName());
System.out.println("Anony CanonicalName: " + getClass().getCanonicalName());
}
};
myAnony = new MyAnony();
}
public void printClassNames() {
System.out.println("CanonicalName, Name: " + getClass().getName());
System.out.println("CanonicalName, CanonicalName: " + getClass().getCanonicalName());
anony.printInterface();
myAnony.printInterface();
}
private static interface Anonymous {
public void printInterface();
}
private static class MyAnony implements Anonymous {
public void printInterface() {
System.out.println("MyAnony Name: " + getClass().getName());
System.out.println("MyAnony CanonicalName: " + getClass().getCanonicalName());
}
}
}
Выход:
CanonicalName, Name: org.test.stackoverflow.CanonicalName
CanonicalName, CanonicalName: org.test.stackoverflow.CanonicalName
Anony Name: org.test.stackoverflow.CanonicalName$1
Anony CanonicalName: null
MyAnony Name: org.test.stackoverflow.CanonicalName$MyAnony
MyAnony CanonicalName: org.test.stackoverflow.CanonicalName.MyAnony
Так что кажется, что для базовых классов они возвращают одно и то же. Для внутренних классов getName()
использует соглашение об именах $
(то есть то, что используется для файлов .class), а getCanonicalName()
возвращает то, что вы использовали бы, если бы пытались создать экземпляр класса. Вы не могли бы сделать это с (маленьким) анонимным классом, поэтому getCanonicalName()
возвращает null.
person
durron597
schedule
09.04.2013
Невозможно найти ответ на свой вопрос за считанные секунды. Похоже на обман. Время вопроса и ответа точно такое же.
- person Maciej Ziarko; 01.04.2014
@MaciejZiarko Внизу есть флажок, чтобы ответить на свой вопрос в стиле вопросов и ответов. Я хотел добавить свое недавнее открытие в базу знаний в SO, потому что нигде не мог его найти.
- person durron597; 01.04.2014
Для дальнейшего использования не называйте класс в честь самой концепции, которую вы пытаетесь исследовать/изобразить...
- person Andrew; 22.08.2017