Что произошло с проводником пакетов в Eclipse?

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

единственный способ быть рядом с этим:

  • Только позволяют заключительные свойства типов, которые неизменны (типы примитивов и классы, которые Вы знаете, неизменны),
  • Требуют, чтобы класс для финала сам
  • Потребовал, чтобы они наследовались базовому классу, который Вы обеспечиваете (который, как гарантируют, будет неизменен)

Тогда, можно свериться со следующим кодом, если объект, который Вы имеете, неизменен:

static boolean isImmutable(Object obj) {
    Class<?> objClass = obj.getClass();

    // Class of the object must be a direct child class of the required class
    Class<?> superClass = objClass.getSuperclass();
    if (!Immutable.class.equals(superClass)) {
        return false;
    }

    // Class must be final
    if (!Modifier.isFinal(objClass.getModifiers())) {
        return false;
    }

    // Check all fields defined in the class for type and if they are final
    Field[] objFields = objClass.getDeclaredFields();
    for (int i = 0; i < objFields.length; i++) {
        if (!Modifier.isFinal(objFields[i].getModifiers())
                || !isValidFieldType(objFields[i].getType())) {
            return false;
        }
    }

    // Lets hope we didn't forget something
    return true;
}

static boolean isValidFieldType(Class<?> type) {
    // Check for all allowed property types...
    return type.isPrimitive() || String.class.equals(type);
}

Обновление: , Как предложено в комментариях, это могло быть расширено для рекурсивного вызова суперкласс вместо того, чтобы проверить на определенный класс. Было также предложено рекурсивно использовать isImmutable в isValidFieldType Методе. Это могло, вероятно, работать, и я также сделал некоторое тестирование. Но это не тривиально. Вы не можете только проверить все типы поля с вызовом к isImmutable, потому что Строка уже проваливает этот тест (его поле hash не является окончательным!). Также Вы легко сталкиваетесь с бесконечными рекурсиями, вызывая StackOverflowErrors;) Другие проблемы могли бы быть вызваны дженериками, где также необходимо проверить их типы на неизменность.

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

14
задан Peter Mortensen 24 December 2016 в 15:25
поделиться

4 ответа

Три автоответчика были полезны, однако единственным лекарством было переустановить Eclipse и снова установить плагины. Странная проблема, точная причина не найдена. Возможно, я каким-то образом удалил некоторые файлы, но переустановка решила эту проблему.

0
ответ дан 1 December 2019 в 05:53
поделиться

Я предполагаю, что вы сделали это быстрым просмотром или свернули до него. Вы можете попробовать удерживать Ctrl + F7 , чтобы увидеть список всех представлений, а затем стрелку вверх / вниз для перехода к просмотру. Если проводник пакетов есть в списке, он был свернут или что-то в этом роде.

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

38
ответ дан 1 December 2019 в 05:53
поделиться

Вы уверены, что находитесь в перспективе Java?

Поскольку представления связаны с перспективами, это может быть проблемой. Текущая перспектива находится в правом верхнем углу.

1
ответ дан 1 December 2019 в 05:53
поделиться

Возможно, вам не хватает подключаемого модуля JDT, содержащего проводник пакетов.

1
ответ дан 1 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: