在尝试运行以下方法时,我得到了一个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;我只是在学习使用反射,所以我确信这是某种语法错误……
发布于 2013-03-15 06:00:12
只有当字段为public时,getField方法才会查找该字段。您将需要改用getDeclaredField方法,该方法将查找在类中直接声明的任何字段,即使它不是public。
发布于 2013-03-15 06:00:28
根据javadoc的说法,Class.getField()“返回一个Field对象,该对象反映由该Class对象表示的类或接口的指定公共成员字段”。如果要访问非公共字段,请使用getDeclaredField()。
发布于 2014-05-07 15:59:17
getClass().getField()问题的最佳解决方案是:
使用getDeclaredField()而不是getField():的
String propertyName = "test";
Class.forName(this.getClass().getName()).getDeclaredField(propertyName); String propertyName = "name";
HelloWorld.class.getDeclaredField(propertyName);如果您想要获取列的注释长度:
HelloWorld.class.getDeclaredField(propertyName).getAnnotation(Column.class).length();https://stackoverflow.com/questions/15420968
复制相似问题