1122 votes

Quelle est la différence entre un nom canonique, simple nom et le nom de classe dans la Classe Java?

En Java: Quelle est la différence entre:

Object o1= ....
o1.getClass().getSimpleName();
o1.getClass().getName();
o1.getClass().getCanonicalName();

?

Mise à JOUR

J'ai déjà vérifié la Javadoc plusieurs fois et pourtant, cela n'explique jamais, c'est bien. J'ai également exécuter un test et qui ne reflète pas la réelle signification de la façon dont ces méthodes sont appelées.

Donc, s'il vous plaît, au lieu de me blâmer moi pour cette question et m'intimant de javadoc, essayer de donner un peu d'efforts pour expliquer le vrai sens derrière eux. Merci pour votre soutien.

1284voto

Nick Holt Points 12945

Si vous êtes incertain au sujet de quelque chose, essayez d'écrire un test en premier.

J'ai fait cela:

//primitive
System.out.println(int.class.getName());
System.out.println(int.class.getCanonicalName());
System.out.println(int.class.getSimpleName());

System.out.println();

//class
System.out.println(String.class.getName());
System.out.println(String.class.getCanonicalName());
System.out.println(String.class.getSimpleName());

System.out.println();

//inner class
System.out.println(HashMap.SimpleEntry.class.getName());
System.out.println(HashMap.SimpleEntry.class.getCanonicalName());
System.out.println(HashMap.SimpleEntry.class.getSimpleName());        

System.out.println();

//anonymous inner class
System.out.println(new Serializable(){}.getClass().getName());
System.out.println(new Serializable(){}.getClass().getCanonicalName());
System.out.println(new Serializable(){}.getClass().getSimpleName());

Impressions:

int
int
int

java.lang.String
java.lang.String
String

java.util.AbstractMap$SimpleEntry
java.util.AbstractMap.SimpleEntry
SimpleEntry

ClassnameTest$1
null

Il y a une ligne vide dans le dernier bloc où getSimpleName retourne une chaîne vide.

Le résultat de regarder c'est:

  • le nom est le nom que vous souhaitez utiliser pour charger dynamiquement la classe avec, par exemple, un appel à l' Class.forName avec la valeur par défaut du chargeur de classe.
  • le nom canonique est le nom qui sera utilisé dans une instruction d'importation et identifie de manière unique la classe. Pourrait être utile lors d' toString ou l'exploitation forestière.
  • le simple nom vaguement identifie la classe, de nouveau pourrait être utile lors d' toString ou l'enregistrement des opérations, mais n'est pas garanti d'être unique.

84voto

gerardw Points 330

L'ajout de tableaux:

    //primitive
    System.out.println(int.class.getName());
    System.out.println(int.class.getCanonicalName());
    System.out.println(int.class.getSimpleName());

    System.out.println();

    //class
    System.out.println(String.class.getName());
    System.out.println(String.class.getCanonicalName());
    System.out.println(String.class.getSimpleName());

    System.out.println();

    //inner class
    System.out.println(HashMap.SimpleEntry.class.getName());
    System.out.println(HashMap.SimpleEntry.class.getCanonicalName());
    System.out.println(HashMap.SimpleEntry.class.getSimpleName());        

    System.out.println();

    //anonymous inner class
    System.out.println(new Serializable(){}.getClass().getName());
    System.out.println(new Serializable(){}.getClass().getCanonicalName());
    System.out.println(new Serializable(){}.getClass().getSimpleName());

    System.out.println();

    {
    //primitive Array
    int demo[] = new int[5];
    Class<? extends int[]> clzz = demo.getClass();
    System.out.println(clzz.getName());
    System.out.println(clzz.getCanonicalName());
    System.out.println(clzz.getSimpleName());
    }

    System.out.println();

    {
    //Object Array
    Integer demo[] = new Integer[5]; 
    Class<? extends Integer[]> clzz = demo.getClass();
    System.out.println(clzz.getName());
    System.out.println(clzz.getCanonicalName());
    System.out.println(clzz.getSimpleName());
    }

ajoute

[I
int[]
int[]

[Ljava.lang.Integer;
java.lang.Integer[]
Integer[]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X