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

标签 java class names canonical-name

<分区>

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

最佳答案

考虑以下程序:

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() 返回什么如果您尝试实例化该类,您将使用。你不能用(小的)匿名类做到这一点,所以这就是 getCanonicalName() 返回 null 的原因。

关于java - 名称和规范名称有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15903672/

相关文章:

java - 将表连接到 jtextbox

c++ - 使用指针访问数组中的对象数据成员

java - ActionBar 的选项卡标题中的自定义字体

java - 为什么我的 oauth2 配置没有使用我的自定义 UserService?

php - 扩展 PHP 类

r - 提取 lapply 中列出的数据框名称

r - 在 cbind 或 rbind 之后丢失表的名称

c++ - 至少内部名称的前 31 或 63 个字符是有意义的?

java - Android Recycler View "onBindViewHolder"函数 "static method cannot be called from non-static method"中的问题

c++ - 读取文件时两次获得相同的输出