getClass()上的NoSuchFieldException.getField()

时间:2012-04-25 12:28:16

标签: java

java.lang.NoSuchFieldException: id

以下行正在创建例外。

String fieldValue =String.valueOf(studyplanCategory.getClass().getField(filterProperty).get(studyplanCategory)); 

studyplanCategory是一个有效的对象,并且具有实际值。由于此异常,我的JSF webapp的LazyLoading DataTable中的load方法和搜索功能无效。

4 个答案:

答案 0 :(得分:19)

来自Class.getField(...)的{​​{3}}:

  

返回反映指定公共成员字段的Field对象   由此Class对象表示的类或接口的。名字   parameter是一个String,指定所需字段的简单名称。   要反映的字段由下面的算法确定。   设C为该对象表示的类:

     

如果C声明了一个指定名称的公共字段,那就是   要反映的领域。如果在上面的步骤1中找不到任何字段,则为此   算法递归地应用于C的每个直接超接口。   直接超级接口按它们的顺序搜索   声明。如果在上面的步骤1和2中没有找到字段,则C具有   超类S,然后在S上递归调用该算法。如果是C.   没有超类,然后抛出NoSuchFieldException。请参阅Java   语言规范,第8.2和8.3节。

如果您要通过以下方式检索字段:

studyplanCategory.getClass().getField(filterProperty)

是私有的,那么你将获得NoSuchFieldException。对于私人字段,请尝试以下方法:

studyplanCategory.getClass().getDeclaredField(filterProperty)

通过这种方式设置值时,可以解决潜在的非法访问异常:

Field field = studyplanCategory.getClass().getDeclaredField(filterProperty);
field.setAccessible(true);
field.get(studyplanCategory);

答案 1 :(得分:8)

应用程序启动此异常,因为它没有看到您想要回馈的属性。 方法getField()返回非私有属性,所以如果你的属性是私有的,方法不会看到它们。您可以查看http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.html

所以你可以这样做,你的属性将在受保护或公开上改变,然后应该正确地工作。但这种方式(与Primefaces上的示例相同)模拟真实数据库。

public List<Car> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {  
        List<Car> data = new ArrayList<Car>();  

        //filter  
        for(Car car : datasource) {  
            boolean match = true;  

            for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {  
                try {  
                    String filterProperty = it.next();  
                    String filterValue = filters.get(filterProperty);  
                    String fieldValue = String.valueOf(car.getClass().getField(filterProperty).get(car));  

...

因此,此列表仅模拟真实数据库。如果你想使用它。所以你应该在支持bean类上做这件事并且做到了。您已经使用某个过滤器打开了连接,或者没有,然后从数据库返回数据。

//编辑:Man写道你应该使用getDeclaredField()但是我确实尝试了这个并且它运行不正常,并抛出了IlegalAccessException。当pretype属于受保护时,它工作正常。我不知道为什么。

答案 2 :(得分:1)

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

使用 getDeclaredField ()代替 getField ()

1)

String propertyName = "test";<br/>
Class.forName(this.getClass().getName()).getDeclaredField(propertyName);

2)

String propertyName = "name";<br/>
Replace **"HelloWorld"** with your class name<br/>
HelloWorld.class.getDeclaredField(propertyName)

答案 3 :(得分:0)

我遇到了同样的问题。我的问题是我的变量不是公开。确保您的班级变量为公开

  private Object getVariableValue(Object clazz, String variableName) {
    try {
        Field field = clazz.getClass().getField(variableName);
        return field.get(clazz);
    } catch (NoSuchFieldException e) {
        return "";
    } catch (IllegalAccessException e) {
        return "";
    }

}