名称和规范名称有什么区别?

14
Class.getName()Class.getCanonicalName()有什么区别?

1
请参见https://dev59.com/92Up5IYBdhLWcg3wj4Du。 - Anurag Sharma
@Anush 很有趣,我查找时没有看到那个,它只比我的早一个月。谢谢。 - durron597
1个回答

17

考虑以下程序:

package org.test.stackoverflow;

public class CanonicalName {

  public static void main(String[] args) {
    CanonicalName cn = new CanonicalName();
    cn.printClassNames();
  }

  private Anonymous anony;
  private MyAnony myAnony;

  public CanonicalName() {
    anony = new Anonymous() {
      public void printInterface() {
        System.out.println("Anony Name: " + getClass().getName());
        System.out.println("Anony CanonicalName: " + getClass().getCanonicalName());
      }
    };
    myAnony = new MyAnony();
  }

  public void printClassNames() {
    System.out.println("CanonicalName, Name: " + getClass().getName());
    System.out.println("CanonicalName, CanonicalName: " + getClass().getCanonicalName());
    anony.printInterface();
    myAnony.printInterface();
  }

  private static interface Anonymous {
    public void printInterface();
  }

  private static class MyAnony implements Anonymous {
    public void printInterface() {
      System.out.println("MyAnony Name: " + getClass().getName());
      System.out.println("MyAnony CanonicalName: " + getClass().getCanonicalName());
    }
  }
}

输出:

CanonicalName, Name: org.test.stackoverflow.CanonicalName
CanonicalName, CanonicalName: org.test.stackoverflow.CanonicalName
Anony Name: org.test.stackoverflow.CanonicalName$1
Anony CanonicalName: null
MyAnony Name: org.test.stackoverflow.CanonicalName$MyAnony
MyAnony CanonicalName: org.test.stackoverflow.CanonicalName.MyAnony

看起来对于基本类,它们返回相同的结果。对于内部类,getName() 使用 $ 命名约定(即用于 .class 文件的约定),而 getCanonicalName() 返回如果您尝试实例化类所需使用的名称。你无法使用一个小写字母 a 的匿名类这样做,所以 getCanonicalName() 返回 null。


1
在短短几秒钟内找到自己问题的答案是不可能的,这看起来像是欺骗。问题和答案的时间完全相同。 - Maciej Ziarko
9
在底部有一个复选框“以问答的形式回答您自己的问题”。我想将我最近的发现添加到 SO 的知识库中,因为我在任何地方都找不到它。 - durron597
为了以后的参考,请不要将类命名为你试图探索/描绘的概念。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接