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;
我只是学习使用reflection,所以我相信这是某种语法错误…
getField
方法只会在public
find该字段。 您将需要使用getDeclaredField
方法,而不是直接在类上声明的字段,即使它不是public
。
根据javadoc, Class.getField()
“返回一个Field
对象,该对象反映了由此Class
对象表示的类或接口的指定公共成员字段”。 如果你想访问非公开的字段,使用getDeclaredField()
。
getClass().getField()
问题的最佳解决scheme是:
使用getDeclaredField ()而不是getField ()
1) String propertyName = "test"; Class.forName(this.getClass().getName()).getDeclaredField(propertyName);
2)将“HelloWorld”replace为您的课程名称
String propertyName = "name"; HelloWorld.class.getDeclaredField(propertyName)
如果你想获得列的注释长度
HelloWorld.class.getDeclaredField(propertyName).getAnnotation(Column.class).length()
我根据标题来到这个问题。 我得到了同样的错误( NoSuchFieldException
)在我的Android项目,但出于不同的原因。
所以对于来这里的其他人来说,这个错误也可能是由于Android Studio中的caching不同步造成的。 转到文件>无效caching/重新启动…
也看到这一点