首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getClass()上的NoSuchFieldException .getField()

getClass()上的NoSuchFieldException .getField()
EN

Stack Overflow用户
提问于 2012-04-25 20:28:16
回答 4查看 19.4K关注 0票数 6
代码语言:javascript
复制
java.lang.NoSuchFieldException: id

下面这行代码正在创建异常。

代码语言:javascript
复制
String fieldValue =String.valueOf(studyplanCategory.getClass().getField(filterProperty).get(studyplanCategory)); 

studyplanCategory是一个有效的对象,并且具有实际值。由于这个异常,我的JSF的LazyLoading DataTable中的load方法和search函数不起作用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-25 20:45:40

App会触发这个异常,因为它看不到你想要回馈的属性。方法getField()返回非私有属性,因此如果你的属性是私有的,那么方法看不到它们。你可以查看http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.html

所以你可以这样做,你的属性将在受保护或公共上改变,然后应该正确地工作。但是这种方式(和primefaces上的例子一样)模拟真实的数据库。

代码语言:javascript
复制
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时,它工作得很好。我也不知道原因。

票数 9
EN

Stack Overflow用户

发布于 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节。

如果您尝试通过以下方式检索的字段:

代码语言:javascript
复制
studyplanCategory.getClass().getField(filterProperty)

是私有的,那么你就会得到一个NoSuchFieldException。对于私有字段,请尝试执行以下操作:

代码语言:javascript
复制
studyplanCategory.getClass().getDeclaredField(filterProperty)

当以这种方式通过字段设置值时,为了避免潜在的非法访问异常:

代码语言:javascript
复制
Field field = studyplanCategory.getClass().getDeclaredField(filterProperty);
field.setAccessible(true);
field.get(studyplanCategory);
票数 20
EN

Stack Overflow用户

发布于 2014-05-07 15:56:03

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

使用getDeclaredField()而不是getField()

1)

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

2)

代码语言:javascript
复制
String propertyName = "name";<br/>
Replace **"HelloWorld"** with your class name<br/>
HelloWorld.class.getDeclaredField(propertyName)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10315614

复制
相关文章

相似问题

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