当字段存在NoSuchFieldException(NoSuchFieldException whe

2019-07-21 16:20发布

我得到一个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;

我只是学习使用反射,所以我敢肯定这是某种形式的一个语法错误的...

Answer 1:

getField的方法只能发现场,如果它是public 。 您将需要使用getDeclaredField方法来代替,这将发现, 直接宣布了类中的任何领域,即使它不是public



Answer 2:

据的Javadoc, Class.getField() “返回一个Field ,它反映此表示的类或接口的指定公共成员字段对象Class的对象”。 使用getDeclaredField()如果要访问非公共领域。



Answer 3:

对于最佳的解决方案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()


Answer 4:

我来到了基于标题这个问题。 我得到了同样的错误( NoSuchFieldException在我的Android项目,但出于不同的原因)。

因此,对于其他人谁来到这里,这个错误也有可能被缓存不同步的Android Studio中引起的。 转到文件>的Invalidate缓存/重新启动...

见这也



文章来源: NoSuchFieldException when field exists