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;

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

4 55

4 ответа:

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

в соответствии с документацией, Class.getField() " возвращает a Field объект, который отражает указанное поле открытого члена класса или интерфейса, представленного этим

лучшие решения для 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()

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

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

посмотреть этой и