Eclipse отладка в исходный код Java, не перечисляет переменные-члены исходных классов - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь отладить исходные файлы JDK. Чтобы быть более конкретным, мне интересно изучить внутреннюю реализацию классов Collection.

Итак, я создал простой Java-проект и добавил пример кода, подобный этому:

import java.util.HashMap;
import java.util.Map;

public class HashMapWorking {
    public static void main(String[] args) {
        Map<String, String> demoMap = new HashMap<>();

        demoMap.put("one", "first");
        demoMap.put("two", "second");
        demoMap.put("three", "third");
    }
}

Мне нужно знать, например, что происходит, когда я вызываю метод demoMap.put().

Я добавил исходный архив с помощью Редактировать путь поиска исходного кода :

enter image description here

Теперь моя проблема заключается в том, что при отладке в методе put() в классе java.util.HashMap вкладка Variables неперечислить его переменные-члены. Вместо этого я просто вижу аргументы, передаваемые соответствующим методам:

enter image description here

Локальные переменные с методами не фиксируются либо

Что я могу сделать, чтобы иметь возможность отлаживать через исходный код Java, как я могу отлаживать в любых других исходных классах?

Я пытался ссылаться на src.zip , а также на извлеченныйверсия src.zip в диалоговом окне Редактировать путь поиска источника , ни один из них не работал.

Пожалуйста, сообщите.

1 Ответ

1 голос
/ 03 ноября 2019

Поля класса. На размещенном вами дисплее вы фактически не остановлены ни в методе HashMap.put(K,V), а в методе HashMap.hash(Object) (который вызывает put). hash(Object) - это метод static - он выполняется без контекста 'instance' (в частности, this).

Если вы перейдете в стек к методу put(K,V) (или к любому другому методу экземпляра), вы увидите, что у него есть объект HashMap как this. Если поле еще не раскрыто, щелкните поле «плюс», чтобы увидеть все поля в классе.

Хотя статические поля (только) доступны для статического метода (и в зависимости от видимости, для методов в других классах, которые неиметь или использовать экземпляр), окно / представление «Переменные» не может найти их. Вы можете получить доступ к invididual статическим полям в окне / представлении 'Выражения' - хотя в стандартных (JDK) классах, которые я рассматривал, статические поля в основном являются константами, значение которых дано в исходном коде, таким образом, глядя наони с отладчиком не очень полезны.

Локальные переменные. Старые сборки Oracle, очевидно, скомпилированы с LineNumber (и SourceFile) отладочной информацией, но без LocalVariable отладочной информации. Это отдельные подопции;см. справочное сообщение или руководство по javac. Без этой информации в файле классов отладчик не отображает локальные переменные или имена для параметров (он отображает значения для параметров, например arg0 arg1 и т. Д., Поскольку тип информация находится в основных данных файла класса).

Я не знаю, почему они это сделали;возможно, это был остаток от дней с открытым исходным кодом. Сборки Oracle для более новых версий (j9 и выше) и некоторых сборок OpenJDK, которые я мог легко проверить, do имеют LocalVariables. Вы можете попробовать один из них (использование более новой версии может зависеть в некоторой степени от вашей версии Eclipse).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...