В чем разница между Name и CanonicalName?

В чем разница между Class.getName() и Class.getCanonicalName() в Java?


person durron597    schedule 09.04.2013    source источник
comment
См. также stackoverflow.com/questions/15202997/   -  person Anurag Sharma    schedule 17.12.2013
comment
@ Ануш, смешно, я не видел этого, когда искал, он всего на месяц старше моего. Спасибо   -  person durron597    schedule 17.12.2013


Ответы (1)


Рассмотрим следующую программу:

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.

person durron597    schedule 09.04.2013
comment
Невозможно найти ответ на свой вопрос за считанные секунды. Похоже на обман. Время вопроса и ответа точно такое же. - person Maciej Ziarko; 01.04.2014
comment
@MaciejZiarko Внизу есть флажок, чтобы ответить на свой вопрос в стиле вопросов и ответов. Я хотел добавить свое недавнее открытие в базу знаний в SO, потому что нигде не мог его найти. - person durron597; 01.04.2014
comment
Для дальнейшего использования не называйте класс в честь самой концепции, которую вы пытаетесь исследовать/изобразить... - person Andrew; 22.08.2017