프로그래밍 언어/JAVA

Java Class에서 canonical name, simple name, class name의 차이점

Rateye 2021. 12. 15. 11:38
728x90
반응형
질문 : Java 클래스에서 표준 이름, 단순 이름 및 클래스 이름의 차이점은 무엇입니까?

Java에서 이들의 차이점은 무엇입니까?

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

Javadoc을 여러 번 확인했지만 이것이 잘 설명되지 않습니다. 나는 또한 테스트를 실행했으며 이러한 메서드가 호출되는 방식의 실제 의미를 반영하지 않았습니다.

답변

확실하지 않은 경우 먼저 테스트를 작성해보십시오.

저는 이것을 했어요:

class ClassNameTest {
    public static void main(final String... arguments) {
        printNamesForClass(
            int.class,
            "int.class (primitive)");
        printNamesForClass(
            String.class,
            "String.class (ordinary class)");
        printNamesForClass(
            java.util.HashMap.SimpleEntry.class,
            "java.util.HashMap.SimpleEntry.class (nested class)");
        printNamesForClass(
            new java.io.Serializable(){}.getClass(),
            "new java.io.Serializable(){}.getClass() (anonymous inner class)");
    }

    private static void printNamesForClass(final Class<?> clazz, final String label) {
        System.out.println(label + ":");
        System.out.println("    getName():          " + clazz.getName());
        System.out.println("    getCanonicalName(): " + clazz.getCanonicalName());
        System.out.println("    getSimpleName():    " + clazz.getSimpleName());
        System.out.println("    getTypeName():      " + clazz.getTypeName()); // added in Java 8
        System.out.println();
    }
}

출력:

int.class (primitive):
    getName():          int
    getCanonicalName(): int
    getSimpleName():    int
    getTypeName():      int

String.class (ordinary class):
    getName():          java.lang.String
    getCanonicalName(): java.lang.String
    getSimpleName():    String
    getTypeName():      java.lang.String

java.util.HashMap.SimpleEntry.class (nested class):
    getName():          java.util.AbstractMap$SimpleEntry
    getCanonicalName(): java.util.AbstractMap.SimpleEntry
    getSimpleName():    SimpleEntry
    getTypeName():      java.util.AbstractMap$SimpleEntry

new java.io.Serializable(){}.getClass() (anonymous inner class):
    getName():          ClassNameTest$1
    getCanonicalName(): null
    getSimpleName():    
    getTypeName():      ClassNameTest$1

getSimpleName 이 빈 문자열을 반환하는 마지막 블록에 빈 항목이 있습니다.

이것을 보는 결과는 다음과 같습니다.

  • 이름 은 클래스를 동적으로로드하는 데 사용하는 이름입니다 (예 : ClassLoader 사용하여 Class.forName 호출). ClassLoader 범위 내에서 모든 클래스는 고유 한 이름을 갖습니다.
  • 정식 이름 은 import 문에 사용되는 이름입니다. toString 또는 로깅 작업 중에 유용 할 수 있습니다. javac 컴파일러가 클래스 경로의 전체보기를 가질 때 컴파일 타임에 정규화 된 클래스 및 패키지 이름을 충돌시켜 정식 이름의 고유성을 적용합니다. 그러나 JVM은 이러한 이름 충돌을 허용해야하므로 표준 이름은 ClassLoader 내에서 클래스를 고유하게 식별하지 않습니다. (돌아 보면이 getter의 더 나은 이름은 getJavaName ,이 메소드는 JVM이 Java 프로그램을 실행하는 데만 사용 된 때부터 시작되었습니다.)
  • 간단한 이름 은 클래스를 느슨하게 식별합니다. 다시 toString 또는 로깅 작업 중에 유용 할 수 있지만 고유하다고 보장 할 수는 없습니다.
  • 유형 이름 은 "이 유형의 이름에 대한 정보 문자열", " toString 과 유사합니다. 순전히 정보를 제공하며 계약 값이 없습니다"를 반환합니다. (sir4ur0n에 의해 작성 됨)
출처 : https://stackoverflow.com/questions/15202997/what-is-the-difference-between-canonical-name-simple-name-and-class-name-in-jav
728x90
반응형