如果不确定某件事,请尝试先编写测试。
我这样做:
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(原始): getName():int getCanonicalName():int getSimpleName():int getTypeName():intString.class(普通类): getName():java.lang.String getCanonicalName():java.lang.String getSimpleName():字符串 getTypeName():java.lang.Stringjava.util.HashMap.SimpleEntry.class(嵌套类): getName():java.util.AbstractMap $ SimpleEntry getCanonicalName():java.util.AbstractMap.SimpleEntry getSimpleName():SimpleEntry getTypeName():java.util.AbstractMap $ SimpleEntry新的java.io.Serializable(){}。getClass()(匿名内部类): getName():ClassNameTest $ 1 getCanonicalName():空 getSimpleName(): getTypeName():ClassNameTest $ 1最后一个块中有一个空条目,其中
getSimpleName返回一个空字符串。
结果是:
- 该 名称 是您愿意使用动态加载与类,例如,调用的名称
Class.forName
与默认ClassLoader
。在一定范围内ClassLoader
,所有类都有唯一的名称。 - 该 规范名称 是将在import语句中使用的名称。在执行
toString
或记录操作时,它可能很有用。当javac
编译器具有类路径的完整视图时,它通过在编译时冲突完全限定的类和包名称来在其中强制规范名称的唯一性。但是,JVM必须接受此类名称冲突,因此规范名称不能唯一地标识内的类ClassLoader
。(事后看来,该getter的更好的名字应该是getJavaName
;但是此方法可以追溯到JVM仅用于运行Java程序的时间。) - 在 简单的名字 松散标识类,又可能是有用的过程
toString
或记录的操作,但不能保证是唯一的。 - 类型名称 返回“ 此 类型名称 的信息字符串”,“类似于toString():它纯粹是信息信息,没有合约值”(如sir4ur0n所写)



