java.lang.NoSuchFieldException: id
以下行正在创建例外。
String fieldValue =String.valueOf(studyplanCategory.getClass().getField(filterProperty).get(studyplanCategory));
studyplanCategory是一个有效的对象,并且具有实际值。由于此异常,我的JSF webapp的LazyLoading DataTable中的load方法和搜索功能无效。
答案 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 "";
}
}