Как найти анонимный внутренний класс в 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
будет иметь информацию об окружающих и внутренних классах (включая несвязанные классы, которые просто используются, поэтому будьте осторожны при интерпретации).