Подтвердить что ты не робот

NoSuchFieldException, когда поле существует

Я получаю 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;

Я просто научился использовать отражение, поэтому я уверен, что это какая-то синтаксическая ошибка...

4b9b3361

Ответ 1

Метод getField найдет только поле, если оно public. Вам нужно будет использовать метод getDeclaredField, который найдет любое поле, объявленное непосредственно в классе, даже если оно не public.

Ответ 2

В соответствии с javadoc, Class.getField() "Возвращает объект Field, который отражает указанное поле публичного члена класса или интерфейса, представленного этим объектом Class". Используйте getDeclaredField(), если вы хотите получить доступ к непубличным полям.

Ответ 3

Лучшие решения для проблемы 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()

Ответ 4

Я пришел к этому вопросу, основываясь на названии. Я получал ту же ошибку (NoSuchFieldException) в своем Android-проекте, но по другой причине.

Итак, для других, которые приходят сюда, эта ошибка также может быть вызвана тем, что тайники не синхронизируются в Android Studio. Перейдите в Файл > Недействительный кэш/Перезапустить...

Смотрите this также

Ответ 5

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