您的位置:首页 > 职场人生

黑马程序员——黑马学习日志之二十二 Java高新技术(四)

2014-07-03 00:35 309 查看
------- android培训java培训、期待与您交流!
----------

黑马学习日志之二十二 Java高新技术(四)
1 JavaBean
内省对应的英文单词为IntroSpector,检查 视察。它主要用于对JavaBean进行操作,
JavaBean是一种特殊的Java类,其中的某些方法名字符合某种命名规则,如果一个Java类中的一些方法符合某种命名规则,则可以把它当作JavaBean来使用。一个JavaBean可以当做普通Java类来使用,但是一个普通Java类不一定可以当做JavaBean来使用。
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
(1)如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,

这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。例如 订单信息等

这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,

则需要通过一些相应的方法来访问,get和set方法。
(2)JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。

如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?

如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?

去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
setId()的属性名  id

isLast()的属性名 last

setCPU的属性名CPU

getUPS的属性名 UPS
总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,

它根本看不到java类内部的成员变量。
(3)一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处:

在Java EE开发中,经常要使用到JavaBean;很多环境就要求按JavaBean方式进行操作;
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省;如果要你自己去通过getX方法来访问私有的x,用内省这套api操作JavaBean比用普通类的方式更方便。
2 对JavaBean的简单内省操作
属性描述符类:
PropertyDescription:描述 Java Bean 通过一对存储器方法导出的一个属性。
构造方法:
public PropertyDescriptor(String propertyName, Class<?> beanClass)通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。
方法:
public Method getReadMethod()获得应该用于读取属性值的方法。
public Method getWriteMethod()获得应该用于写入属性值的方法。
public Object invoke(Object obj, Object... args)对带有指定参数的指定对象调用由此 Method 对象表示的底层方法
例子:

public static void main(String[] args) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, Exception {

      Demo_Field df = new Demo_Field("a","b");

       String propertyName = "x";

     PropertyDescriptor dp = new PropertyDescriptor(propertyName,df.getClass());

      Method method = dp.getReadMethod();

       Object retVal = method.invoke(df);

      System.out.println(retVal);

     Method method1 = dp.getWriteMethod();

     method1.invoke(df, "ab");

     System.out.println(df.getX());

}
3 对JavaBean的复杂内省操作
接口 BeanInfo:提供有关其 bean 的显式信息
类 Introspector:为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。
用遍历BeanInfo的所有属性方式来查找和设置某个RefectPoint对象的x属性。

在程序中把一个类当作JavaBean来看,就是调用IntroSpector.getBeanInfo方法, 

得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息。
例子:

private static Object getProperty(Object pt1, String propertyName)throws IntrospectionException, IllegalAccessException,InvocationTargetException {

    BeanInfo beanInfo =  Introspector.getBeanInfo(pt1.getClass());

    PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

       Object retVal = null;

       for(PropertyDescriptor pd : pds){

          if(pd.getName().equals(propertyName))

           {

              Method methodGetX = pd.getReadMethod();

              retVal = methodGetX.invoke(pt1);

            break;

          }

      }

      return retVal;

 }
4 使用BeanUtils工具包操作JavaBean
Beanutils工具包:就是专门对javabean进行操作的工具类 方便代码简写
用BeanUtils类先get原来设置好的属性,再将其set为一个新值。

get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串。
用PropertyUtils类先get原来设置好的属性,再将其set为一个新值。

get属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型。
例子:

System.out.println(BeanUtils.getProperty(pt1, "x").getClass().getName());

       BeanUtils.setProperty(pt1, "x", "9");

       System.out.println(pt1.getX());
       BeanUtils.setProperty(pt1, "birthday.time", "111");

       System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));

       PropertyUtils.setProperty(pt1, "x", 9);

       System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());
 
 
 

------- android培训java培训、期待与您交流!
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员