问题描述
[code="java"][/code] import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor; public class BeanInfoTest { public int getA(){ return 1; } public static void main(String[] args) { try { BeanInfo bi =Introspector.getBeanInfo(BeanInfoTest.class, Object.class); PropertyDescriptor pd[] = bi.getPropertyDescriptors(); for(PropertyDescriptor prodes:pd){ System.out.println(prodes.getName()); System.out.println(prodes.getReadMethod()); System.out.println(prodes.getWriteMethod()); } } catch (IntrospectionException e) { e.printStackTrace(); } }} 附件是结果,它竟然帮我找到了property a。我比较好奇的问题是,我明明没有定义a这个字段的。难道反射的时候都是通过找到getXX setXX方法来判断是不是有这个属性吗?感觉这也太不合适了。还是说这样只是为了让所有权在我们手上,让我们使用规范的bean。提供完整的set get方法和字段?还望知道的人告知一二,
解决方案
LZ自己已经说出了正确答案了
解决方案二:
补充下,Java就是按你所说的,只看getter和setter来判别属性。甚至即使你定义个public的属性,不提供getter和setter,Java反而找不到这个明明可以访问的属性。我觉得主要原因是Java世界不推荐public属性,推荐用getter和setter来“间接”处理。而在大多数情况下getter和setter也是相对较好的选择。比如属性需要只读或只写。需要在getter或setter时做特殊处理,比如返回只读集合时。同个属性扮演多个角色。比如日期属性,既有日期的getter和setter,也有(默认)格式化成String的getter和setter。虚拟的属性。比如代理模式下,好多属性并不是自己的。或者根本就是一段逻辑处理等。等等。后两种情况下,都是无法做出楼主提出的引用判断是不是有这个属性。另一方面,getter和setter导致大量的臃肿代码这个问题,虽然讨论很多,目前看来,类似C#等语言那种改进还遥遥无期。
解决方案三:
bean代表一个数据对象,你的测试bean写的就已经不是规范的。还是说这样只是为了让所有权在我们手上,让我们使用规范的bean。提供完整的set get方法和字段?----这里不一定非要有一对get set方法。可以只有get,但不能只有set,既然用到bean又不符合mvf思想那又有什么意义呢?yunzhu 已经说得很清楚了,你自己已经说了正确答案
解决方案四:
class A{ private int a; //这是字段名 public void setAbc( a) { this.a = a; } public int getAbc() { return this.a; }}abc就是你的属性名 prodes.getName() 拿的是属性名 要区别开字段名 和 属性名