1136 Stimmen

Was ist der Unterschied zwischen kanonischem Namen, einfachem Namen und Klassennamen in Java Class?

Was ist in Java der Unterschied zwischen diesen beiden:

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

Ich habe mir die Javadoc mehrfach angesehen, aber das erklärt es nicht gut. Ich habe auch einen Test durchgeführt, der keine wirkliche Bedeutung hinter der Art und Weise, wie diese Methoden aufgerufen werden, erkennen ließ.

5voto

Sim Punkte 12521

Es ist interessant festzustellen, dass getCanonicalName() y getSimpleName() kann erhöhen InternalError wenn der Klassenname falsch geformt ist. Dies geschieht bei einigen Nicht-Java-JVM-Sprachen, z. B. Scala.

Betrachten Sie das Folgende (Scala 2.11 auf Java 8):

scala> case class C()
defined class C

scala> val c = C()
c: C = C()

scala> c.getClass.getSimpleName
java.lang.InternalError: Malformed class name
  at java.lang.Class.getSimpleName(Class.java:1330)
  ... 32 elided

scala> c.getClass.getCanonicalName
java.lang.InternalError: Malformed class name
  at java.lang.Class.getSimpleName(Class.java:1330)
  at java.lang.Class.getCanonicalName(Class.java:1399)
  ... 32 elided

scala> c.getClass.getName
res2: String = C

Dies kann ein Problem für gemischtsprachige Umgebungen oder Umgebungen sein, die dynamisch Bytecode laden, z. B. App-Server und andere Plattformsoftware.

2voto

Abdul Alim Shakir Punkte 1060

getName() - gibt den Namen der Entität (Klasse, Schnittstelle, Array-Klasse, primitiver Typ oder void), die durch dieses Class-Objekt dargestellt wird, als String zurück.

getCanonicalName() - gibt den kanonischen Namen der zugrunde liegenden Klasse zurück, wie er in der Java Language Specification definiert ist.

getSimpleName() - gibt den einfachen Namen der zugrundeliegenden Klasse zurück, d. h. den Namen, der ihr im Quellcode gegeben wurde.

package com.practice;

public class ClassName {
public static void main(String[] args) {

  ClassName c = new ClassName();
  Class cls = c.getClass();

  // returns the canonical name of the underlying class if it exists
  System.out.println("Class = " + cls.getCanonicalName());    //Class = com.practice.ClassName
  System.out.println("Class = " + cls.getName());             //Class = com.practice.ClassName
  System.out.println("Class = " + cls.getSimpleName());       //Class = ClassName
  System.out.println("Class = " + Map.Entry.class.getName());             // -> Class = java.util.Map$Entry
  System.out.println("Class = " + Map.Entry.class.getCanonicalName());    // -> Class = java.util.Map.Entry
  System.out.println("Class = " + Map.Entry.class.getSimpleName());       // -> Class = Entry 
  }
}

Ein Unterschied besteht darin, dass Sie bei Verwendung einer anonyme Klasse können Sie einen Nullwert erhalten, wenn Sie versuchen, den Namen der Klasse mit der Methode getCanonicalName()

Eine weitere Tatsache ist, dass getName() Methode verhält sich anders als die getCanonicalName() Methode für innere Klassen . getName() verwendet einen Dollar als Trennzeichen zwischen dem kanonischen Namen der umschließenden Klasse und dem einfachen Namen der inneren Klasse.

Mehr Informationen über Abrufen eines Klassennamens in Java .

1voto

Shirish Singh Punkte 557
    public void printReflectionClassNames(){
    StringBuffer buffer = new StringBuffer();
    Class clazz= buffer.getClass();
    System.out.println("Reflection on String Buffer Class");
    System.out.println("Name: "+clazz.getName());
    System.out.println("Simple Name: "+clazz.getSimpleName());
    System.out.println("Canonical Name: "+clazz.getCanonicalName());
    System.out.println("Type Name: "+clazz.getTypeName());
}

outputs:
Reflection on String Buffer Class
Name: java.lang.StringBuffer
Simple Name: StringBuffer
Canonical Name: java.lang.StringBuffer
Type Name: java.lang.StringBuffer

0voto

Was ist der Unterschied zwischen kanonischem Namen, einfachem Namen und Klasse? name in einer Java-Klasse?

Die Methode getClass() en Java wird verwendet, um die Objekt der Klasse die mit einer bestimmten Objektinstanz verbunden sind. Die Website Objekt der Klasse stellt Informationen über den clase zu dem die Objekt gehört.

En getSimpleName() , getName() y getCanonicalName() Methoden unterscheiden sich in folgenden Punkten:

  • getSimpleName() ist die Methode, die den einfachen Namen der Klasse zurückgibt, die durch das Class-Objekt repräsentiert wird. Sie enthält keine Informationen über ein Paket.

Zum Beispiel: si objectOne ist eine Instanz der java.util.ArrayList class , objectOne.getClass().getSimpleName() wird zurückgegeben ArrayList .

  • getName() ist die Methode, die den vollqualifizierten Namen der Klasse zurückgibt, die durch das Class-Objekt repräsentiert wird, einschließlich des Paketnamens.

Zum Beispiel: si objectOne ist eine Instanz der java.util.ArrayList class , objectOne.getClass().getName() wird zurückgegeben java.util.ArrayList .

  • getCanonicalName() ist die Methode, die den kanonischen Namen der Klasse zurückgibt, die durch das Class-Objekt repräsentiert wird. Der kanonische Name ist der vollqualifizierte Name der Klasse, bei dem jedoch alle generischen Typinformationen entfernt wurden.

Zum Beispiel: si objectOne ist eine Instanz der java.util.ArrayList Klasse mit einer generic type parameter of String , o1.getClass().getCanonicalName() wird zurückgegeben java.util.ArrayList .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X