在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(原始): getName():int getCanonicalName():int getSimpleName():int getTypeName():int String.class(普通类): getName():java.lang.String getCanonicalName():java.lang.String getSimpleName():字符串 getTypeName():java.lang.String java.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返回一个空字符串。
getSimpleName
结果是:
Class.forName
ClassLoader
toString
javac
getJavaName