Name和CanonicalName有什么区别?

dur*_*597 14 java class names canonical-name

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

dur*_*597 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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

所以对于基类来说,它们似乎返回相同的东西.对于内部类,getName()使用$命名约定(即用于.class文件的内容),并getCanonicalName()返回在尝试实例化类时使用的内容.你不能用(小)一个匿名类做到这一点,所以这就是为什么getCanonicalName()返回null.

  • @MaciejZiarko底部有一个复选框"回答你自己的问题,Q&A风格.我想把我最近的发现添加到SO的知识库中,因为我无法在任何地方找到它. (9认同)