Почему getClass возвращает имя класса + $ 1 (или $ *) - PullRequest
8 голосов
/ 24 августа 2011

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

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

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

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

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

Ответы [ 3 ]

15 голосов
/ 24 августа 2011

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

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.

4 голосов
/ 24 августа 2011

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

1 голос
/ 24 августа 2011

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

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

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

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

...