关于BeanInfo的一个问题

[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自己已经说出了正确答案了

class A{
private int a; //这是字段名

public void setAbc( a) {
this.a = a;
}

public int getAbc() {
return this.a;
}

}

abc就是你的属性名 prodes.getName() 拿的是属性名

要区别开字段名 和 属性名

bean代表一个数据对象,你的测试bean写的就已经不是规范的。
还是说这样只是为了让所有权在我们手上,让我们使用规范的bean。提供完整的set get方法和字段?----这里不一定非要有一对get set方法。可以只有get,但不能只有set,既然用到bean又不符合mvf思想那又有什么意义呢?
yunzhu 已经说得很清楚了,你自己已经说了正确答案

补充下,

Java就是按你所说的,[b]只[/b]看getter和setter来判别属性。
甚至即使你定义个public的属性,不提供getter和setter,Java反而找不到这个明明可以访问的属性。

我觉得主要原因是Java世界不推荐public属性,推荐用getter和setter来“间接”处理。
而在大多数情况下getter和setter也是相对较好的选择。比如
[list=1]
[*]属性需要只读或只写。
[*]需要在getter或setter时做特殊处理,比如返回只读集合时。
[*]同个属性扮演多个角色。比如日期属性,既有日期的getter和setter,也有(默认)格式化成String的getter和setter。
[*]虚拟的属性。比如代理模式下,好多属性并不是自己的。或者根本就是一段逻辑处理等。
[/list]

等等。

后两种情况下,都是无法做出楼主提出的[quote]判断是不是有这个属性[/quote]。

另一方面,getter和setter导致大量的臃肿代码这个问题,虽然讨论很多,目前看来,类似C#等语言那种改进还遥遥无期。