NoSuchFieldException字段存在时


75

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;

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


它使您的应用程序崩溃了吗?
IgorGanapolsky

Answers:


158

getField如果为,则该方法只会找到该字段public。您将需要改用getDeclaredField方法,该方法将找到直接在类上声明的任何字段,即使不是public


即使在getField Iam上使用getDeclaredField后,也会收到此错误:-无法访问带有修饰符“ private”的类的成员
Subodh 2015年

10
哦,明白了。我需要使用setAccessible(true)
Subodh,2015年

3
使用时我NoSuchFieldException什至会收到getDeclaredField()错误消息,即使使用后也会出现“具有私密访问权限”错误setAccessible(true)例1Field fieldy = rootElement.getClass().getDeclaredField("name");抛出NoSuchFieldException。但是这样做Field[] fields = rootElement.getClass().getDeclaredFields();允许我遍历这些字段,当我调用时field.getName(),它返回“名称”。那怎么办?
Joe Flack

1
解决了:看来我必须进行一次尝试/捕获
Joe Flack

12

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


8

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

2

我是基于标题来到这个问题的。我NoSuchFieldException在Android项目中遇到了相同的错误(),但原因有所不同。

因此,对于其他人来说,此错误也可能是由Android Studio中的缓存不同步引起的。转到“文件”>“使缓存无效/重新启动...”

也看到这个


1

对于所有看到这似乎仍无法解决该问题的Android开发人员,请检查是否启用了Proguard。如果是这样,则可能是所涉及的类被混淆了,您需要添加规则以防止这种情况发生。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.