黑马程序员-JavaBean类与java内省总结
来源:互联网 发布:hadoop2.7.2 windows 编辑:程序博客网 时间:2024/05/07 17:24
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、JavaBean类概述
1、JavaBean是一种特殊的java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有 的字段,且方法名符合某种规则。
2、如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要相应的方法来访问,如getter方法和setter方法。
3、JavaBean的属性是根据其中的getter方法和setter方法来确定的,而不是根据其中的成员变量。举个例子,如果某个JavaBean类有方法setId()与getId(),那么我们认为它有个叫做id的属性,至于它内部实际封装的私有成员变量叫什么则不必关心。
4、根据方法名推断属性名的规则:
1)去掉set/get前缀,剩余部分就是属性名。2)若剩余部分的第二个字母为小写,则将剩余部分的首字母改为小写;若其为大写,则剩余部分的首字母仍为大写。举例,
setId()的属性名:id;
isLast()的属性名:last;
setCPU的属性名:CPU;
5、一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当作JavaBean类使用会带来一些额外好处:
1)java EE开发中,经常会使用到JavaBean类。很多环境要求按JavaBean方式进行操作,别人都这么用和要求这么做,我们也别无选择。
2)JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。使用内省操作JavaBean比使用普通类的方式更加方便。
二、内省
1、内省的概念
内省,英文名introspector,意思是自省、反省。它主要用于对JavaBean类进行操作。
2、通过内省对JavaBean进行操作
例1:简单的操作方式
package com.cn.itcast;public class ReflectPoint {private int x;private int y;public ReflectPoint(int x,int y){super();this.x=x;this.y=y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}}
package com.cn.itcast;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 {public static void main(String[] args) throws Exception{ReflectPoint rp=new ReflectPoint(3, 5); String propertyName="x";//通过普通反射方式获取属性x的值时,需要经历下面几个步骤,十分繁琐//"x"-->"X"-->"getX"-->methodGetX-->x//通过内省,获取x属性的值PropertyDescriptor pd=new PropertyDescriptor(propertyName, rp.getClass());//通过属性名,获取该对象rp下该属性x的属性描述器Method methodGetX=pd.getReadMethod();//通过属性描述器,获取该属性x的读方法,即getter方法Object retVal=methodGetX.invoke(rp);//利用反射调用该getter方法,获取属性x的值System.out.println(retVal);//通过内省,设置x属性的值Method methodSetX=pd.getWriteMethod();//通过属性描述器,获取该属性x的写方法,即setter方法methodSetX.invoke(rp, 7);////利用反射调用该setter方法,设置属性x的值System.out.println(rp.getX());}}
输出结果:
37
利用重构,将例1中的代码进行简化:
public class IntrospectorTest {public static void main(String[] args) throws Exception{ReflectPoint rp=new ReflectPoint(3, 5); String propertyName="x";Object retVal = getProperty(propertyName, rp);System.out.println(retVal);Object value=7;setProperty(propertyName, rp, value);System.out.println(rp.getX());}private static void setProperty(String propertyName, Object rp,Object value) throws IntrospectionException,IllegalAccessException, InvocationTargetException {PropertyDescriptor pd=new PropertyDescriptor(propertyName, rp.getClass());Method methodSetX=pd.getWriteMethod();methodSetX.invoke(rp, value);}private static Object getProperty(String propertyName, Object rp)throws IntrospectionException, IllegalAccessException,InvocationTargetException {PropertyDescriptor pd=new PropertyDescriptor(propertyName, rp.getClass());Method methodGetX=pd.getReadMethod();Object retVal=methodGetX.invoke(rp);return retVal;}}
例2:较麻烦的操作方式
public class IntrospectorTest {public static void main(String[] args) throws Exception{ReflectPoint rp=new ReflectPoint(3, 5); String propertyName="x";//较麻烦的操作方式BeanInfo beanInfo=Introspector.getBeanInfo(rp.getClass()); //获取该JavaBean类的beanInfo,它存储了该JavaBean的所有属性信息PropertyDescriptor[] pds= beanInfo.getPropertyDescriptors();//获取该JavaBean类的所有属性描述器Object retVal=null;for(PropertyDescriptor pd:pds){if(pd.getName().equals(propertyName)){ //判断是否x属性的描述器 Method methodGetX=pd.getReadMethod();retVal=methodGetX.invoke(rp);break;}}System.out.println(retVal);//3}}
3、Beanutils工具包
Beanutils工具包是阿帕奇公司提供的开源工具包,用于更方便地操作JavaBean类。
例3:
package com.cn.itcast;public class ReflectPoint {private Date birthday=new Date();private int x;private int y;public ReflectPoint(int x,int y){super();this.x=x;this.y=y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}}
package com.cn.itcast;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.beanutils.PropertyUtils;public class IntrospectorTest {public static void main(String[] args) throws Exception{ReflectPoint rp=new ReflectPoint(3, 5); String propertyName="x";//利用Beanutils工具包操作JavaBean类System.out.println(BeanUtils.getProperty(rp, propertyName));//直接获取某个对象的某个属性的值,类似例1中重构后的方法BeanUtils.setProperty(rp, propertyName,"9");//直接设置某个对象的某个属性的值,类似例1中重构后的方法,但注意其接收的值类型为Object,常用String类型,更符合开发实际需求System.out.println(rp.getX());System.out.println(BeanUtils.getProperty(rp, propertyName).getClass().getName());//说明该方法返回值为String类型,比例1中重构后的方法更符合开发实际需求//支持对属性链的连续调用BeanUtils.setProperty(rp, "birthday.time", "111");System.out.println(BeanUtils.getProperty(rp, "birthday.time"));//get方法返回该属性本来的类型,set方法只接受该属性本类的类型PropertyUtils.setProperty(rp, propertyName, 12);System.out.println(rp.getX());}}输出结果:
39java.lang.String11112
- 黑马程序员-JavaBean类与java内省总结
- 黑马程序员:Java基础总结----JavaBean 内省
- 黑马程序员--JavaBean与内省
- 【黑马程序员】java基础加强------------------javabean与内省操作
- 黑马程序员——内省JavaBean总结
- 黑马程序员-高新技术-JavaBean与内省
- 黑马程序员---内省JavaBean
- 黑马程序员---JavaBean & 内省
- 黑马程序员--内省JavaBean
- 黑马程序员-内省,javabean
- 黑马程序员--JavaBean内省
- 黑马程序员--java高新技术--javaBean内省
- 黑马程序员------java高新技术、javaBean和内省
- 黑马程序员-内省、操作JavaBean工具类
- 黑马程序员-内省和JavaBean
- 黑马程序员---javaBean & introspector(内省)
- 黑马程序员----内省,了解 javaBean
- 黑马程序员——java编程那些事儿____jdk1.5新特性 javaBean与内省
- 查找ros小包攻击源
- 3.11 Roman to Integer
- android热点
- 3.12 Count and Say
- 付费版百度指数 就是这么坑爹
- 黑马程序员-JavaBean类与java内省总结
- 程序员的晋升之路
- POJ 2506 Tiling 递推+大数
- loadrunner--测试环境中如果系统有验证码
- 【整理】adb命令、adb shell与Linux各种命令(busybox)
- POJ-3134-Power Calculus(迭代加深DFS)
- POJ1258——Agri-Net(最小生成树)
- [002]还在做游戏的飞行操作....
- 考研资料 非常全