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 ответа:
The
getField
метод найдет поле только в том случае, если оноpublic
. Вам нужно будет использоватьgetDeclaredField
метод вместо этого, который найдет любое поле, которое объявлено напрямую на класс, даже если это неpublic
.
в соответствии с документацией,
Class.getField()
" возвращает aField
объект, который отражает указанное поле открытого члена класса или интерфейса, представленного этим
лучшие решения для
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...
посмотреть этой и