首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当字段存在时为NoSuchFieldException

当字段存在时为NoSuchFieldException
EN

Stack Overflow用户
提问于 2013-03-15 05:56:50
回答 7查看 74.6K关注 0票数 79

在尝试运行以下方法时,我得到了一个java.lang.NoSuchFieldException

代码语言:javascript
复制
 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类的一个字段:

代码语言:javascript
复制
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;

我只是在学习使用反射,所以我确信这是某种语法错误……

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-03-15 06:00:12

只有当字段为public时,getField方法才会查找该字段。您将需要改用getDeclaredField方法,该方法将查找在类中直接声明的任何字段,即使它不是public

票数 164
EN

Stack Overflow用户

发布于 2013-03-15 06:00:28

根据javadoc的说法,Class.getField()“返回一个Field对象,该对象反映由该Class对象表示的类或接口的指定公共成员字段”。如果要访问非公共字段,请使用getDeclaredField()

票数 11
EN

Stack Overflow用户

发布于 2014-05-07 15:59:17

getClass().getField()问题的最佳解决方案是:

使用getDeclaredField()而不是getField():的

代码语言:javascript
复制
        String propertyName = "test";
        Class.forName(this.getClass().getName()).getDeclaredField(propertyName);

  1. "HelloWorld"替换为您的类名:

代码语言:javascript
复制
        String propertyName = "name";
        HelloWorld.class.getDeclaredField(propertyName);

如果您想要获取列的注释长度:

代码语言:javascript
复制
HelloWorld.class.getDeclaredField(propertyName).getAnnotation(Column.class).length();
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15420968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档