2013-04-09 9 views
13

Qual è la differenza tra Java Class.getName() e Class.getCanonicalName()?Qual è la differenza tra Nome e CanonicalName?

+1

Vedere anche http://stackoverflow.com/questions/15202997/what-is-the-difference-between-canonical-name-simple-name-and-class-name-in-jav – Anush

+0

@Anush funny, I non l'ho visto mentre lo guardavo, che è solo un mese più vecchio del mio. Grazie – durron597

risposta

17

Si consideri il seguente programma:

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

uscita:

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 

così sembra che per le classi di base, ritornano la stessa cosa. Per le classi interne, getName() utilizza la convenzione di denominazione $ (vale a dire ciò che viene utilizzato per i file .class) e getCanonicalName() restituisce ciò che si utilizzerà se si stesse tentando di creare un'istanza della classe. Non è possibile farlo con una (poco-a) classe anonima, ecco perché getCanonicalName() restituisce null.

+1

È impossibile trovare la risposta alla tua domanda in pochi secondi. Sembra un inganno. I tempi della domanda e la risposta sono esattamente gli stessi. –

+9

@MaciejZiarko C'è una casella di controllo in basso "rispondi alla tua domanda, stile Q & A. Ho voluto aggiungere la mia scoperta recente alla knowledge base in SO, perché non potevo trovarlo da nessuna parte. – durron597

+0

Per riferimento futuro, non nominare la classe dopo il concetto stesso che stai cercando di esplorare/ritrarre ... – Andrew

Problemi correlati