黑马程序员_高新技术JavaBean

来源:互联网 发布:pitta mask 知乎 编辑:程序博客网 时间:2024/05/16 10:04
一、由内省引出JavaBean的讲解
IntroSpector(内省)---->JavaBean(特殊的java类)
JavaBean在MVC设计模式中是model,又称模型层,在一般的程序中,我们称为数据层.作用:用来设置数据的属性和一些行为他们都是私有的,然后提供获取属性和设置属性get/set方法.
总之,一个类被当作JavaBena使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量.
一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:
1.在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!
2.JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的方式更方便。
简单的说:内省是java语言岁Bean类属性,事件的一种缺省处理方法.
public class IntrospectorTest_对JavaBean内省操作 {public static void main(String[] args) throws Exception{JavaBeanTest test = new JavaBeanTest(3, 4);String propertyName = "x";//定义一个属性名Object getVal = getProperty(test, propertyName);System.out.println(getVal);Object value = 7; setProperty(test, propertyName, value);System.out.println(test.getX());//7}private static void setProperty(Object test, String propertyName,Object value) throws IntrospectionException,IllegalAccessException, InvocationTargetException {//创建属性的描述器,参数是(属性名,一个javaBean的类)PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, test.getClass());//通过属性描述器获取这个类中x属性的set方法Method methodSetX = pd2.getWriteMethod();//调用这个属性set方法,修改这个属性的值methodSetX.invoke(test,value);}private static Object getProperty(Object test, String propertyName)throws IntrospectionException, IllegalAccessException,InvocationTargetException {/*//创建属性的描述器,参数是(属性名,一个javaBean的类)PropertyDescriptor pd1 = new PropertyDescriptor(propertyName, test.getClass());//通过属性描述器获取这个类中x属性的get方法Method methodGetX = pd1.getReadMethod();//调用这个属性get方法,获得到这个属性的值Object getVal = methodGetX.invoke(test);*//*采用遍历BeanInfo的所有属性方式来查找和设置某个JavaBeanTest对象的x属性。在程序中把一个类当作JavaBean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息。*/BeanInfo info = Introspector.getBeanInfo(test.getClass());//只能得到所有的属性,没有得到摸一个具体属性的方法PropertyDescriptor[] descriptors =info.getPropertyDescriptors();Object getVal = null;//通过描述器迭代,判断我是否得到这个属性名for (PropertyDescriptor pd : descriptors) {if(pd.getName().equals(propertyName)){//通过属性描述器获取这个类中x属性的get方法Method methodGetX = pd.getReadMethod();//调用这个属性get方法,获得到这个属性的值 getVal = methodGetX.invoke(test); break;}}return getVal;}}


一般做法就通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(propertyDescriptor),通过这个属性描述器就可以获取某个属性对应的get/set方法.然后我们就可以通过反射机制来调用这些方法.
使用BeanUtils工具包
BeanUtils的由来:前面都是用内省的方式对JavaBean的属性进行了get和set操作.由于对JavaBean的属性进行读取和设置操作的频率很高,这个需求非常广泛,那么就会有一些开源的人们会做一些方便的工具类,这就出现了BeanUtils工具包,这就是阿帕奇提供了专门对JavaBean操作的工具包.方便了对JavaBean的属性get/set操作.
需要工具包:commons-beanutiles-current.zip解压后的commons-beanutiles.jar
   commons-logging-1.1.jar
工具包源码:commons-beanutiles-current-src.zip
<span style="white-space:pre"></span>//在这里我们接受的这个参数是String类型System.out.println(BeanUtils.getProperty(pt1, "y"));//7/*在这里我们设置的这个参数也是String类型, BeanUtils自己会在内部去转成相应的类型*/BeanUtils.setProperty(pt1, "y", "99");System.out.println(pt1.getY());/*//Java7的新特性,JavaBean与Map可以相互转换,Map的key就相当于JavaBean的属性Map map = {name:”zxx”,age=18};BeanUtils.setProperty(map, "name", “lhm");*/BeanUtils.setProperty(pt1, “brithday.time”, “111”);//它可以支持属性面,一级级点下去System.out.println(PropertyUtils.getProperty(pt1, "brithday.time");//小知识点PropertyUtils.setProperty(pt1, “x”, 9);/*PropertyUtils是以这个属性本身的类型进行操作..如果不想做类型转换,或者说BeanUtils类型<span style="white-space:pre"></span>转换有错误,那就直接用PropertyUtils*/System.out.println(PropertyUtils.getProperty(pt1, “x").getClass().getName(); 

0 0
原创粉丝点击