java.lang.NoSuchFieldException: id下面这行代码正在创建异常。
String fieldValue =String.valueOf(studyplanCategory.getClass().getField(filterProperty).get(studyplanCategory)); studyplanCategory是一个有效的对象,并且具有实际值。由于这个异常,我的JSF的LazyLoading DataTable中的load方法和search函数不起作用。
发布于 2012-04-25 20:45:40
App会触发这个异常,因为它看不到你想要回馈的属性。方法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));
...因此此列表仅用于模拟真实数据库。如果你想用它的话。所以你应该在backing类上做这件事,这样就可以了。你已经用一些过滤器打开了连接,或者没有,然后从数据库返回数据。
//编辑: Man写道,你应该使用getDeclaredField(),但我确实尝试过,它没有很好地工作,并抛出了IlegalAccessException。当预类型属性为protected时,它工作得很好。我也不知道原因。
发布于 2012-04-25 20:44:02
从Class.getField(...)的Javadoc
返回一个字段对象,该对象反映这个类对象所表示的类或接口的指定公共成员字段。name参数是一个字符串,指定所需字段的简单名称。要反射的字段由随后的算法确定。设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);发布于 2014-05-07 15:56:03
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)https://stackoverflow.com/questions/10315614
复制相似问题