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 |