黑马程序员--高新技术--内省
2014-02-14 23:15
253 查看
------- android培训、java培训、期待与您交流! ----------
目录:1、内省概述 [b]2、对JavaBean的复杂内省操作[b]3、BeanUtils工具包:[/b][/b]
1、内省概述:
IntroSpector:即内省,是对内部进行检查,了解更多的底层细节。
内省的作用:主要针对JavaBean进行操作。
JavaBean简述:
1)JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法都符合某种特殊的命名规则。
2)它是一种特殊的Java类,其中的方法名称等,都符合特殊的规则。只要一个类中含有get和set打头的方法,就可以将其当做JavaBean使用。
作用:
如果要在两个模板之间传递多个信息,可将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO),这些信息在类中用私有字段来储存,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。
命名方式:
JavaBean的属性是根据其中的setter和getter方法来确定的,而不是依据其中的变量,如方法名为setId,则中文意思是设置Id,getId也是如此;去掉前缀,剩余部分就是属性名称,如果剩余部分的第二个字母小写,则把剩余部分改为小写。如:getAge/setAge-->age;gettime-->time;setTime-->time;getCPU-->CPU。
总之、一个类被当做JavaBean使用时,JavaBaan的属性是根据方法名推断出来的,它根本看不到Java类内部的成员变量。
JavaBean的好处:
一个符合JavaBean特点的类当做普通类一样可以使用,但是把它当做JavaBean类用肯定有好处的:
1)在JavaEE开发中,经常要使用JavaBean。很多环境就要求按JavaBean的方式进行操作,别人都这么用,那么就必须要求这么做。
2)JDK中提供了对JavaBean进行操作的API,这套API称为内省,若要自己通过getX的方式来访问私有x,可用内省这套API,操作JavaBean要比使用普通的方式更方便。
示例:
2、对JavaBean的复杂内省操作:
1、在IntroSpector类中有getBeanInfo(Class cls)的方法。
2、获取Class对象的Bean信息,返回的是BeanInfo类型。
3、BeanInfo类中有getPropertyDescriptors()的方法,可获取所有的BeanInfo的属性信息,返回一个PropertyDescriptor[]。
4、在通过遍历的形式,找出与自己想要的那个属性信息。
如:改写get方法:
3、BeanUtils工具包:
1、BeanUtils等工具包都是有阿帕奇提供的,为了便于开发。
2、好处:
1)提供的set或get方法中,传入的是字符串,返回的还是字符串,因为在浏览器中,用户输入到文本框的都是以字符串的形式发送至服务器上的,所以操作的都是字符串。也就是说这个工具包的内部有自动将整数转换为字符串的操作。
2)支持属性的级联操作,即支持属性链。如可以设置:人的脑袋上的眼镜的眼珠的颜色。这种级联属性的属性连如果自己用反射,那就很困难了,通过这个工具包就可以轻松调用。
3、可以和Map集合进行相互转换:可将属性信息通过键值对的形式作为Map集合存储(通过static
java.util.Map describe(java.lang.Object bean)的方法),也可以将Map集合转换为JavaBean中的属性信息(通过static void populate(java.lang.Object
bean, java.util.Map properties)的方法)。
示例:
假定有个birthday的私有属性
private Date birthday = new Date();
set方法:
BeanUtils.getProperty(pt1”birthday.time”,”111”)
get方法:
String value = BeanUtils.getProperty(pt1,”x”)
4、补充:
1)BeanUtils是以字符串的形式进行操作的
2)PropertyUtils是以传入值本身的类型进行操作的。
------- android培训、java培训、期待与您交流! ----------
97c4
目录:1、内省概述 [b]2、对JavaBean的复杂内省操作[b]3、BeanUtils工具包:[/b][/b]
1、内省概述:
IntroSpector:即内省,是对内部进行检查,了解更多的底层细节。
内省的作用:主要针对JavaBean进行操作。
JavaBean简述:
1)JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法都符合某种特殊的命名规则。
2)它是一种特殊的Java类,其中的方法名称等,都符合特殊的规则。只要一个类中含有get和set打头的方法,就可以将其当做JavaBean使用。
作用:
如果要在两个模板之间传递多个信息,可将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO),这些信息在类中用私有字段来储存,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。
命名方式:
JavaBean的属性是根据其中的setter和getter方法来确定的,而不是依据其中的变量,如方法名为setId,则中文意思是设置Id,getId也是如此;去掉前缀,剩余部分就是属性名称,如果剩余部分的第二个字母小写,则把剩余部分改为小写。如:getAge/setAge-->age;gettime-->time;setTime-->time;getCPU-->CPU。
总之、一个类被当做JavaBean使用时,JavaBaan的属性是根据方法名推断出来的,它根本看不到Java类内部的成员变量。
JavaBean的好处:
一个符合JavaBean特点的类当做普通类一样可以使用,但是把它当做JavaBean类用肯定有好处的:
1)在JavaEE开发中,经常要使用JavaBean。很多环境就要求按JavaBean的方式进行操作,别人都这么用,那么就必须要求这么做。
2)JDK中提供了对JavaBean进行操作的API,这套API称为内省,若要自己通过getX的方式来访问私有x,可用内省这套API,操作JavaBean要比使用普通的方式更方便。
示例:
package cn.itcast.text1; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class IntroSpectorTest { /** * @param args */ /* * public static void main(String[] args) throws Exception { // TODO Auto-generated method stub ReflectPoint pt1 = new ReflectPoint(3,5); String propertyName = "x"; //"x"-->"X"-->"getX"-->MethodGetX--> //内省的方式: //属性描述符:PropertyDescriptor //get属性信息 PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass()); Method methodGetX = pd.getReadMethod(); Object retVal = methodGetX.invoke(pt1); System.out.println(retVal); //set属性信息 Object value = 7; PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass()); Method methodSetX = pd2.getWriteMethod(); methodSetX.invoke(pt1,value); System.out.println(pt1.getX()); } */ //上面的get或set代码分别通过选中要重构的代码,通过右击选重构获得get和set方法: public static void main(String[] args) throws Exception { // TODO Auto-generated method stub ReflectPoint pt1 = new ReflectPoint(3,5); String propertyName = "x"; //一般方式:"x"-->"X"-->"getX"-->MethodGetX--> //内省方式: //通过get和set方法获取属性值 Object retVal = getProperty(pt1, propertyName); System.out.println(retVal); Object value = 7; setProperty(pt1, propertyName, value); System.out.println(pt1.getX()); } //设置属性值的方法 //此处的类型为Object,通用,下同 private static void setProperty(Object rf, String propertyName, Object value) throws IntrospectionException, IllegalAccessException, InvocationTargetException { //创建属性描述符对象,将属性名称和加载文件等信息写入其中 PropertyDescriptor pd = new PropertyDescriptor(propertyName,rf.getClass()); //通过反射的方法类Method,获取属性所对应的set方法 Method methodSetX = pd.getWriteMethod(); methodSetX.invoke(rf, value); } //获取属性值的方法 private static Object getProperty(Object rf, String propertyName) throws IntrospectionException, IllegalAccessException, InvocationTargetException { //创建属性描述符对象,获取属性所对应的名称和加载文件等信息 PropertyDescriptor pd = new PropertyDescriptor(propertyName,rf.getClass()); //通过反射的方法类Method,获取属性所对应的get方法 Method methodGetX = pd.getReadMethod(); Object retVal = methodGetX.invoke(rf); return retVal; } }
2、对JavaBean的复杂内省操作:
1、在IntroSpector类中有getBeanInfo(Class cls)的方法。
2、获取Class对象的Bean信息,返回的是BeanInfo类型。
3、BeanInfo类中有getPropertyDescriptors()的方法,可获取所有的BeanInfo的属性信息,返回一个PropertyDescriptor[]。
4、在通过遍历的形式,找出与自己想要的那个属性信息。
如:改写get方法:
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); Object value = null; for(PropertyDescriptor pd : pds){ if(pd.getName().equals(propertyName)){ Method methodGetX = pd.getReadMethod(); value = methodGetX.invoke(pt1); break; } }
3、BeanUtils工具包:
1、BeanUtils等工具包都是有阿帕奇提供的,为了便于开发。
2、好处:
1)提供的set或get方法中,传入的是字符串,返回的还是字符串,因为在浏览器中,用户输入到文本框的都是以字符串的形式发送至服务器上的,所以操作的都是字符串。也就是说这个工具包的内部有自动将整数转换为字符串的操作。
2)支持属性的级联操作,即支持属性链。如可以设置:人的脑袋上的眼镜的眼珠的颜色。这种级联属性的属性连如果自己用反射,那就很困难了,通过这个工具包就可以轻松调用。
3、可以和Map集合进行相互转换:可将属性信息通过键值对的形式作为Map集合存储(通过static
java.util.Map describe(java.lang.Object bean)的方法),也可以将Map集合转换为JavaBean中的属性信息(通过static void populate(java.lang.Object
bean, java.util.Map properties)的方法)。
示例:
假定有个birthday的私有属性
private Date birthday = new Date();
set方法:
BeanUtils.getProperty(pt1”birthday.time”,”111”)
get方法:
String value = BeanUtils.getProperty(pt1,”x”)
4、补充:
1)BeanUtils是以字符串的形式进行操作的
2)PropertyUtils是以传入值本身的类型进行操作的。
------- android培训、java培训、期待与您交流! ----------
97c4
相关文章推荐
- 黑马程序员——高新技术——内省、注解、类加载器
- 黑马程序员—java高新技术_枚举&反射&内省
- 黑马程序员--内省和JavaBean--java学习日记13(高新技术)
- 黑马程序员_第六天_高新技术之理解对JavaBean的内省操作
- 黑马程序员__JAVA高新技术--枚举及内省JavaBean、可变参数等知识点总结
- 黑马程序员——Java高新技术---枚举、内省、类加载器、注解
- 黑马程序员_高新技术二(java内省注解泛型)
- 黑马程序员_java高新技术总结【3】(内省、注解、代理)
- 黑马程序员-高新技术(内省,注解)
- 黑马程序员——高新技术——类加载器,内省,注解,动态代理
- 黑马程序员--高新技术--枚举、反射、注解、类加载器、内省
- 黑马程序员-----高新技术-----Java内省机制细讲
- 黑马程序员_Java高新技术——反射和内省(第8篇)
- 黑马程序员--【强哥笔记】系列之Java高新技术笔记之JavaBean内省(第4天)
- 黑马程序员_高新技术:2) 枚举、内省JavaBean
- 黑马程序员_Java高新技术3(框架,JavaBeans与内省(Introspector)) - 伊秋
- 【黑马程序员】张孝祥Java高新技术_内省、注解、泛型
- 黑马程序员——Java高新技术——内省JavaBean及BeanUtils的应用、注解等
- 黑马程序员————高新技术————内省(了解JavaBean)
- 黑马程序员 高新技术<四>--->内省、注解与类加载器