NoSuchFieldException, коли поле існує


75

Я отримую java.lang.NoSuchFieldExceptionпри спробі запустити наступний метод:

 public void getTimes(String specialty, String day) {
    ArrayList<Tutor> withSpec = new ArrayList<Tutor>();
    for (Tutor t : tutorList){
        try {
            Time startTime = (Time)t.getClass().getField(day + "Start").get(t);
        } catch (NoSuchFieldException | SecurityException | IllegalAccessException ex) Logger.getLogger(DBHandler.class.getName()).log(Level.SEVERE, null, ex); }

Помилка на лінії Time startTime = (Time)t.getClass().getField(day + "Start").get(t);

Я не розумію цієї помилки, оскільки monStart - це поле Tutorкласу:

Public class Tutor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "tutorID")
private Integer tutorID;

.... 

@Column(name = "monStart")
@Temporal(TemporalType.TIME)
 Date monStart;

Я тільки вчусь користуватися рефлексією, тому впевнений, що це якась синтаксична помилка ...


Чи не спрацював ваш додаток?
ІгорГанапольський

Відповіді:


158

getFieldМетод буде тільки знайти поле , якщо це public. getDeclaredFieldНатомість вам потрібно буде використовувати метод, який знайде будь-яке поле, яке оголошено безпосередньо в класі, навіть якщо це не так public.


навіть після використання getDeclaredField над getField iam при отриманні цієї помилки: - не вдається отримати доступ до члена класу з модифікаторами "private"
Субодд,

10
ох, зрозумій. мені потрібно використовувати setAccessible (істинний)
Subodh

3
Я отримую NoSuchFieldExceptionнавіть при використанні getDeclaredField(), і помилка "має приватний доступ" навіть після використання setAccessible(true). Приклад 1 : Field fieldy = rootElement.getClass().getDeclaredField("name");кидки NoSuchFieldException. Але це Field[] fields = rootElement.getClass().getDeclaredFields();дозволяє мені перебирати поля, і коли я телефоную field.getName(), воно повертає "ім'я". То в чому справа?
Joe Flack,

1
Вирішено : Схоже, мені довелося обгортати спробу / зловити
Джо Флак

12

За словами javadoc, Class.getField() "Повертає Fieldоб'єкт, який відображає вказане загальнодоступне поле-член класу або інтерфейсу, представленого цим Classоб'єктом". Використовуйте, getDeclaredField()якщо хочете отримати доступ до непублічних полів.


8

Найкращі рішення для getClass().getField() проблеми є:

Використовуйте getDeclaredField () замість getField ()

1)  String propertyName = "test";
    Class.forName(this.getClass().getName()).getDeclaredField(propertyName);

2) Замініть "HelloWorld" на назву вашого класу

    String propertyName = "name";
    HelloWorld.class.getDeclaredField(propertyName)

Якщо ви хочете отримати довжину анотації стовпця

HelloWorld.class.getDeclaredField(propertyName).getAnnotation(Column.class).length()

2

Я прийшов до цього питання, спираючись на заголовок. Я отримував ту ж помилку ( NoSuchFieldException) у своєму проекті Android, але з іншої причини.

Тож для інших, хто приходить сюди, ця помилка також може бути спричинена тим, що кеші не синхронізуються в Android Studio. Перейдіть у меню Файл> Вимкнути кеш / перезапустити ...

Дивіться це також


1

Для будь-яких розробників Android, які бачать це, але все ще не можуть вирішити проблему, перевірте, чи ввімкнено Proguard. Якщо це так, можливо, клас, про який йде мова, затьмарюється, і вам потрібно буде додати правила, щоб запобігти цьому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.