2013-04-09 11 views
13

Java'nın Class.getName() ve Class.getCanonicalName() arasındaki fark nedir?İsim ve CanonicalName arasındaki fark nedir?

+1

Ayrıca bkz. Http://stackoverflow.com/questions/15202997/what-is-the-difference-between-canonical-name-simple-name-and-class-name-in-jav – Anush

+0

@Anush funny, I Bakarken bunu görmedim, bu sadece benimkinden bir ay daha büyük. Teşekkürler – durron597

cevap

17

aşağıdaki programı düşünün:

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()); 
    } 
    } 
} 

Çıktı:

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 

Yani temel sınıfları için, aynı şeyi iade gibi görünüyor. İç sınıflar için getName(), $ adlandırma kuralını (yani .class dosyaları için ne kullanılır) kullanır ve getCanonicalName(), sınıfı başlatmaya çalışıyorsanız ne kullanacağınızı döndürür. Bunu (küçük-anonim) bir sınıfla yapamazsınız, bu yüzden getCanonicalName() null döndürür.

+1

Sadece saniyeler içinde kendi sorunuza cevap bulmak imkansız. Aldatmaya benziyor. Sorunun ve cevabın zamanları tam olarak aynı. –

+9

@MaciejZiarko Altta bir onay kutusu var "Kendi sorunuzu cevaplayın, Soru ve Cevap stili. Son keşifimi SO'daki bilgi tabanına eklemek istedim, çünkü hiçbir yerde bulamadım. – durron597

+0

Gelecekte başvurmak için adınızı belirtmeyin keşfetmeye/tasvir etmeye çalıştığınız konseptin ardından sınıf ... – Andrew

İlgili konular