Java反射中的getCanonicalName()和getName()

Java的getCanonicalName和getName

<div class="article-info-box">
    <div class="article-bar-top d-flex">
                                            <span class="time">2017年05月03日 11:50:45</span>
        <div class="float-right">
            <span class="read-count">阅读数:2312</span>
                                        </div>
    </div>
</div>
<article>
    <div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
                <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-62cd27f8b9.css">
                    <div class="htmledit_views">

Java中获取类名主要有三个方法供我们使用:getName(), getCanonicalName() 和getSimpleName().

举个例子看下它们的区别。比如如下类:


  
  
  1. package my;
  2. public class ExternalClassConfig {
  3. private String desc;
  4. // ...
  5. public static class InternalConfig {
  6. // ...
  7. }
  8. }
类里面含有个内部类。

然后我们调用类的上面三个方法看下结果:


  
  
  1. @Test
  2. public void testclassName() {
  3. System.out.println();
  4. System.out.println( "方法 值");
  5. System.out.println( "getName " + ExternalClassConfig.class.getName());
  6. System.out.println( "getCanonicalName " + ExternalClassConfig.class.getCanonicalName());
  7. System.out.println( "getSimpleName " + ExternalClassConfig.class.getSimpleName());
  8. System.out.println( "getName " + InternalConfig.class.getName());
  9. System.out.println( "getCanonicalName " +InternalConfig.class.getCanonicalName());
  10. System.out.println( "getSimpleName " + InternalConfig.class.getSimpleName());
  11. System.out.println();
  12. }

输出结果如下:


  
  
  1. 方法 值
  2. getName my.ExternalClassConfig
  3. getCanonicalName my.ExternalClassConfig
  4. getSimpleName ExternalClassConfig
  5. getName my.ExternalClassConfig$InternalConfig
  6. getCanonicalName my.ExternalClassConfig.InternalConfig
  7. getSimpleName InternalConfig

这里,getName()返回的是虚拟机里面的class的表示,而getCanonicalName()返回的是更容易理解的表示。其实对于大部分class来说这两个方法没有什么不同的。但是对于array或内部类来说是有区别的。
另外,类加载(虚拟机加载)的时候需要类的名字是getName。

再看数组:



  
  
  1. @Test
  2. public void testclassName4Array() {
  3. String [] ss = new String[]{
  4. "zw", "zz"
  5. };
  6. System.out.println();
  7. System.out.println( "方法 值");
  8. System.out.println( "getName " + ss.getClass().getName());
  9. System.out.println( "getCanonicalName " + ss.getClass().getCanonicalName());
  10. System.out.println( "getSimpleName " + ss.getClass().getSimpleName());
  11. System.out.println();
  12. }
输出结果:


  
  
  1. 方法 值
  2. getName [Ljava.lang.String;
  3. getCanonicalName java.lang.String[]
  4. getSimpleName String[]
不习惯这种表示可能觉得有点怪。首先 ‘[’ 表示数组,一个代表一维数组,比如 ‘[[’ 代表二维数组。之后 ‘L’ 代表类描述符,最后分号表示结束。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值