2013-04-09 42 views
13

Java的Class.getName()Class.getCanonicalName()之间的区别是什么?Name和CanonicalName有什么区别?

+1

也见http://stackoverflow.com/questions/15202997/what-is-the-difference-between-canonical-name-simple-name-and-class-name-in-jav – Anush 2013-12-17 09:56:03

+0

@Anush好笑,我在查看时没有看到那个,这只比我大一个月。谢谢 – durron597 2013-12-17 14:23:27

回答

17

考虑下面的程序:

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。

+1

几秒钟内就无法找到对自己问题的答案。看起来像欺骗。问题的时间和答案完全相同。 – 2014-04-01 12:50:33

+9

@MaciejZiarko有在底部的复选框“回答自己的问题,Q&A的风格。我想我的新发现添加到知识库中如此,因为我不能在任何地方找到它。 – durron597 2014-04-01 13:16:06

+0

以供将来参考,不命名课后,你正试图探索/描绘的概念... – Andrew 2017-08-22 16:31:48

相关问题