2013-04-09 41 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

相關問題