【发布时间】:2013-03-31 23:38:55
【问题描述】:
Java 的Class.getName() 和Class.getCanonicalName() 有什么区别?
【问题讨论】:
-
@Anush 好笑,我查的时候没看到那个,它只比我大一个月。谢谢
标签: java class names canonical-name
Java 的Class.getName() 和Class.getCanonicalName() 有什么区别?
【问题讨论】:
标签: java class names canonical-name
考虑以下程序:
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() 返回您尝试实例化类时将使用的内容。你不能用一个 (little-a) 匿名类来做到这一点,所以这就是 getCanonicalName() 返回 null 的原因。
【讨论】: