Нет никакого надежного способа обнаружить, если класс неизменен. Это вызвано тем, что существует столько способов, которыми могло бы быть изменено свойство класса, и Вы не можете обнаружить всех их через отражение.
единственный способ быть рядом с этим:
Тогда, можно свериться со следующим кодом, если объект, который Вы имеете, неизменен:
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;) Другие проблемы могли бы быть вызваны дженериками, где также необходимо проверить их типы на неизменность.
я думаю с некоторой работой, эти потенциальные проблемы могли бы быть решены так или иначе. Но тогда, необходимо спросить себя сначала, если это действительно стоит того (также мудрая производительность).
Три автоответчика были полезны, однако единственным лекарством было переустановить Eclipse и снова установить плагины. Странная проблема, точная причина не найдена. Возможно, я каким-то образом удалил некоторые файлы, но переустановка решила эту проблему.
Я предполагаю, что вы сделали это быстрым просмотром или свернули до него. Вы можете попробовать удерживать Ctrl + F7 , чтобы увидеть список всех представлений, а затем стрелку вверх / вниз для перехода к просмотру. Если проводник пакетов есть в списке, он был свернут или что-то в этом роде.
Если вы выбрали его, но по-прежнему не видите, попробуйте Окно → Сбросить перспективу ... чтобы восстановить для всех представлений значения по умолчанию.
Вы уверены, что находитесь в перспективе Java?
Поскольку представления связаны с перспективами, это может быть проблемой. Текущая перспектива находится в правом верхнем углу.
Возможно, вам не хватает подключаемого модуля JDT, содержащего проводник пакетов.