java getCanonicalName() getSimpleName() getName()区别

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值