您的位置:首页 > 编程语言 > Java开发

JAVA高新技术——JavaBean、内省、BeanUtils工具包

2014-03-04 18:37 423 查看

JavaBean

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。

这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。

可以这么说一个类中含有set与get方法,都可以称作JavaBean类。

一般来说通过get方法与set方法可以获取和操作JavaBean类中的属性,但是在框架设计中,事先并不知道get和set哪一个成员属性。需要通过反射来完成。

而通过反射获取set和get方法相对麻烦,于是SUN公司提供了对JavaBean类进行操作的一些API————内省

内省

假定有一个Point类,成员变量x,y都有get和set方法。又假定事先不知道操作哪个变量以及对象,操作变量和对象的名称是通过参数传递进来的。
如何通过内省的方式对Point类的对象的成员变量进行读写操作?

简单的内省操作——建议使用

public class PropertyDescriptorDemo {
public static void main(String[] args) throws Exception{
//假定下面两个数据是通过参数传递进来的
Point pt1=new Point(2,3);
String PropertyName="x";

//通过PropertyDescriptor类导出一个属性
PropertyDescriptor pd1=new PropertyDescriptor(PropertyName, pt1.getClass());
//通过PropertyDescriptor的属性方法获取get和set方法
Method readMethod=pd1.getReadMethod();
System.out.println(readMethod.invoke(pt1));
Method writeMethod=pd1.getWriteMethod();
writeMethod.invoke(pt1, 100);
System.out.println(readMethod.invoke(pt1));
}

}

复杂的内省操作

public class IntrospectorDemo {

public static void main(String[] args)throws Exception {
Point pt=new Point(2,4);
String PropertyName ="x";

//通过Introspector的方法获得BeanInfo
BeanInfo beanInfo=Introspector.getBeanInfo(pt.getClass());
//只有得到BeanInfo的所有属性,没有特定的某属性,需要遍历
PropertyDescriptor[] pds= beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
if(pd.getName().equals(PropertyName)){
Method readMethod= pd.getReadMethod();
Object reVal=readMethod.invoke(pt);
System.out.println(reVal);
}
}
}
}

BeanUtils工具包

Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性——BeanUtils
注意:BeanUtils包依赖于logging包,所以两个包都有导入。

BeanUtils类的方法非常简单:

static String
getProperty(Object bean, String name)
static void
setProperty(Object bean, String name, Object value)
注意:
1-BeanUtils工具类在对对象的属性进行操作的时候,会自动进行类型转换。例如tPoint类中的x属性为int类型,
但是设置属性值的时候传入的参数却可以是String类型,返回的也是String类。这是因为内部发生了自动类型转换。这是为了以后开发方便起见。

2-BeanUtils工具类可以对属性进行级联操作,例如Point类还有 变量Private Date Birthday ,而Date(java.util.Date)类中有setTime方法,那么也就相当于Date类型对象有一个time属性,BeanUtils就可以对其进行操作:

[align=left]BeanUtils. setProperty(pt, "birthday.time", "111");[/align]

BeanUtils工具包里有很多类,比如PropertyUtils类,他与BeanUtils类的区别在于不会自动类型转换,即Point的x是int类型的那么不会转成String类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐