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
반응형
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
JavaScript 링크 "#" vs "javascript : void (0)" (0) | 2021.12.19 |
---|---|
Java Swing에서 set (Preferred | Maximum | Minimum) Size 메서드를 사용하면 안되는 이유 (0) | 2021.12.19 |
jQuery를 사용하여 JavaScript 개체에서 select 항목에 옵션을 추가하는 가장 좋은 방법 (0) | 2021.12.14 |
JavaScript를 사용하여 이미지를 Base64 문자열로 변환하는 방법 (0) | 2021.12.14 |
Java의 CharSequence VS String (0) | 2021.12.13 |