Как найти анонимный внутренний класс в Eclipse, учитывая только его синтетическое имя (класс $N)?

Как найти анонимный внутренний класс, если мне было присвоено имя класса Class$N при использовании Eclipse, не просматривая код и не подсчитывая каждый анонимный класс? Есть ли функция "перейти к анонимному объявлению класса", где я могу ввести номер суффикса $?

Функция Search- > Java не помогла.

Я использую VisualVM для поиска горячих точек процессора. Моя точка доступа находится в анонимном классе с именем SomeClass $5. VisualVM не может найти источник для моего класса, а я (и другие) не может найти, как связать источник с VisualVM, показанный здесь и here. Плагин запуска не разрешает это.

Подсчет анонимных объявлений не является вариантом, поскольку в долгосрочной перспективе риск человеческой ошибки, сортируя по сотням строк, может привести к большому количеству времени, потраченного впустую, пытаясь работать с неправильным анонимным классом, чтобы узнать, неправильный класс.

В качестве обходного пути я тестирую классы с помощью 'System.out.println("this="+this.getClass().getName());' в методе, чтобы убедиться, что он правильный, но должен быть лучший способ.

Ответы

Ответ 1

Я не знаю, как это сделать в Eclipse, но я могу предложить два других способа найти объявление.


Вы можете вызвать Class.forName("SomeClass$5"), затем вызвать один из Class.getEnclosingMethod или Class.getEnclosingConstructor или Class.getEnclosingClass, чтобы найти его неотложное определение. Это может быть неоднозначным, если несколько анонимных классов находятся в одном и том же закрывающемся элементе, но это дает вам возможность начать поиск.


Вы можете дизассемблировать скомпилированный файл класса с помощью инструмента javap с помощью javap -v SomeClass$5.class. Если файл класса был скомпилирован с отладочной информацией, а анонимный класс содержал хотя бы одно определение метода, атрибуты LineNumberTable для этих определений метода укажут, где они были определены в исходном файле. Атрибут SourceFile будет содержать имя исходного файла. Атрибут EnclosingMethod будет указывать метод окружения (если он есть), а атрибут InnerClasses будет иметь информацию об окружающих и внутренних классах (включая несвязанные классы, которые просто используются, поэтому будьте осторожны при интерпретации).