[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#等语言那种改进还遥遥无期。