黑马程序员——黑马学习日志之二十二 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培训、期待与您交流!
----------
----------
黑马学习日志之二十二 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培训、期待与您交流!
----------
相关文章推荐
- 黑马程序员——黑马学习日志之二十四 Java高新技术(六)
- 黑马程序员——黑马学习日志之二十一 Java高新技术(三)
- 黑马程序员——黑马学习日志之二十 Java高新技术(二)
- 黑马程序员——黑马学习日志之一 Java基础01
- 黑马程序员——黑马学习日志之三 Java基础03
- 黑马程序员——黑马学习日志之四 Java基础——数组
- 黑马程序员_Java学习日记22_高新技术1
- 黑马程序员------java学习笔记之高新技术
- 黑马程序员-java学习日志2
- 黑马程序员 java中关于异常的学习日志
- 黑马程序员_Java学习日记24_高新技术3
- 黑马程序员——java高新技术2学习笔记整理
- 黑马程序员_java学习日记_Java高新技术_反射(二)
- 黑马程序员--Java基础加强(高新技术)学习第一天
- 黑马程序员——java高新技术学习日记(1)
- 黑马程序员---Java高新技术学习笔记(前篇)
- 黑马程序员_JAVA学习日记_JAVAJDK1.5以后高新技术
- 黑马程序员_对于Java高新技术的学习笔记
- 黑马程序员_Java高新技术部分学习笔记
- 黑马程序员_java学习日记_Java高新技术_网络编程