package com.chinamobile.loan.webcore.utils; public class ObjectDynamicCreator { public static void main(String[] args) { class Test2 implements TestCanonical{ byte[] bay; public byte[] getBay() { return bay; } public void setBay(byte[] bay) { this.bay = bay; } } try { //Test2是在这个main函数里面的内部类 System.out.println(Test2[].class.getCanonicalName());//null System.out.println(Test2[].class.getSimpleName());//Test2[] System.out.println(Test2[].class.getName());//[Lcom.chinamobile.loan.webcore.utils.ObjectDynamicCreator$1Test2; System.out.println(Test2.class.getCanonicalName());//null System.out.println(Test2.class.getSimpleName());//Test2 System.out.println(Test2.class.getName());//com.chinamobile.loan.webcore.utils.ObjectDynamicCreator$1Test2 Test2 test21 = new Test2();// System.out.println(test21.getClass().getCanonicalName());//null System.out.println(test21.getClass().getSimpleName());//Test2 System.out.println(test21.getClass().getName());//com.chinamobile.loan.webcore.utils.ObjectDynamicCreator$1Test2 System.out.println(TestCanonical.class.getCanonicalName());//com.chinamobile.loan.webcore.utils.TestCanonical System.out.println(TestCanonical.class.getSimpleName());//TestCanonical System.out.println(TestCanonical.class.getName());//com.chinamobile.loan.webcore.utils.TestCanonical //TestInt TestInt testInt = new TestInt();// System.out.println(testInt.getClass().getCanonicalName());//com.chinamobile.loan.webcore.utils.TestInt System.out.println(testInt.getClass().getSimpleName());//TestInt System.out.println(testInt.getClass().getName());//com.chinamobile.loan.webcore.utils.TestInt TestInt[] testInt2 = new TestInt[]{};// System.out.println(testInt2.getClass().getCanonicalName());//com.chinamobile.loan.webcore.utils.TestInt[] System.out.println(testInt2.getClass().getSimpleName());//TestInt[] System.out.println(testInt2.getClass().getName());//[Lcom.chinamobile.loan.webcore.utils.TestInt; System.out.println(TestCanonical[].class.getCanonicalName());//com.chinamobile.loan.webcore.utils.TestCanonical[] System.out.println(TestCanonical[].class.getSimpleName());//TestCanonical[] System.out.println(TestCanonical[].class.getName());//[Lcom.chinamobile.loan.webcore.utils.TestCanonical; } catch(Exception e) { e.printStackTrace(); } } }
根据实验分析:
1. Test2是main函数的内部类,TestInt是外部的类(打印出的路径上就可以看出),TestCanonical是外部的接口。
2. 正如标题所讲的,这三个的区别必须从对比中看出来:
2.1 getCanonicalName顾名思义的正规的名字,与之对应的是getName。
2.2 对于数组:
getCanonicalName是正规的(最后带有[]表示数组),
getName是编译器的(前面带有[表示一维数组)。
2.2 对于内部类:
getCanonicalName是空,
getName是带有$的。
2.3 getSimpleName是简单的名字,是getName去掉了包名和$(内部类时候带有$)的余下的类自身的名字;
getName带有包名和$(内部类时候带有$)。
3. 再来看内部类所得正规名字为空(对于内部类getCanonicalName打印出的是null),为什么?
还是看其对比的getName,发现内部类的名字带有$(美元符号),显然这是编译器的所认识的名字。
然而,假如想得到正规的名字就不能有美元符号,也就是必须是正规路径,
但是内部类对外不可见,也就没了路径,所以为空。
总结:事出有因,在“事物是普遍联系的”,在对比中,认识其出现的原因,就会掌握其作用。
细心一下:
[Lcom.chinamobile.loan.webcore.utils.ObjectDynamicCreator$1Test2;
[Lcom.chinamobile.loan.webcore.utils.TestInt;
[Lcom.chinamobile.loan.webcore.utils.TestCanonical;
数组的getName最后都带有分号。
参考的文章(感谢博主的分享)
http://sunyimaying0925-gmail-com.iteye.com/blog/768789
http://blog.csdn.net/xinglu/article/details/39058211