Почему getClass возвращает имя класса $1 (или $*)

#java #desktop-application #jprofiler

#java #instanceof

Вопрос:

Я пишу фрагмент кода, в котором я должен привести объект, если он является экземпляром определенного класса.

Как обычно, я использую instanceof для проверки совместимости.

Проблема в том, что проверка никогда не выполняется, потому что объекты принадлежат к «странным» классам.

Например; когда я вызываю метод getClass().getSimpleName() для этого объекта, он возвращает мне имя класса $* (например ViewPart$1 , вместо ViewPart ).

Что это $* значит? Есть ли решение или обходной путь?

Комментарии:

1. это анонимный внутренний класс?

Ответ №1:

Это показывает внутренний класс (либо анонимный (если у него есть номер), либо именованный). Например:

 class Foo {
    static class Bar {
    }
}
 

Имя класса Foo.Bar является Foo$Bar . Теперь, если бы у нас было:

 class Foo {

    static void bar() {
        Runnable r = new Runnable() {
            public void run() {};
        };

        System.out.println(r.getClass());
    }
}
 

Это будет напечатано Foo$1 .

Вы можете увидеть тот же эффект в именовании файлов классов, созданных javac.

Ответ №2:

Это экземпляры анонимного класса. ViewPart$1 это первый анонимный класс, определенный внутри ViewPart , но это не значит, что это подкласс ViewPart . Скорее всего, это анонимная реализация некоторого интерфейса прослушивателя.

Комментарии:

1. Документирован ли тот факт, что Class$X указывает на X анонимный класс th?

2. @Hablutzel: нет, в JLS указано только, что имя должно иметь формат, за которым следуют цифры. Последовательность цифр является деталью реализации компилятора.

Ответ №3:

$ обозначает внутренний класс. Например, рассмотрим два класса

 public class TopClass {
  class SubClass {
     // some methods
  }// inner class end
} // outer class end
 

Если вы скомпилируете этот код, вы получите два файла класса TopClass.class и первоклассный $SubClass.class .

Проверьте свой класс ViewPart, имеет ли он какие-либо внутренние классы. Надеюсь, это поможет.