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方法只会在publicfind该字段。 您将需要使用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/重新启动…

也看到这一点