#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, имеет ли он какие-либо внутренние классы. Надеюсь, это поможет.