Ответ 1
Метод getField
найдет только поле, если оно public
. Вам нужно будет использовать метод getDeclaredField
, который найдет любое поле, объявленное непосредственно в классе, даже если оно не public
.
Я получаю 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;
Я просто научился использовать отражение, поэтому я уверен, что это какая-то синтаксическая ошибка...
Метод getField
найдет только поле, если оно public
. Вам нужно будет использовать метод getDeclaredField
, который найдет любое поле, объявленное непосредственно в классе, даже если оно не public
.
В соответствии с javadoc, Class.getField()
"Возвращает объект Field
, который отражает указанное поле публичного члена класса или интерфейса, представленного этим объектом Class
".
Используйте getDeclaredField()
, если вы хотите получить доступ к непубличным полям.
Лучшие решения для проблемы 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. Перейдите в Файл > Недействительный кэш/Перезапустить...
Смотрите this также
Для всех разработчиков Android, видящих это, которые по-прежнему не могут решить проблему, проверьте, включен ли Proguard. Если это так, возможно, рассматриваемый класс запутывается, и вам потребуется добавить правила, чтобы этого не происходило.