黑马程序员------------------内省,JavaBean,BeanUtils工具包
2014-08-02 14:49
639 查看
------- android培训、java培训、期待与您交流!
----------
一:基础内容
1.必须掌握的英语单词:
bean(豆类;豆子 );
JavaBean(对象,共享,JAVA类,模型);
info(信息);
Descriptor(描述符号)
Introspector(内省);
PropertyDescriptor(属性描述器 )
property(性质)
Properties(性能,道具,内容,属性,特性)
2.必须理解的类与接口:
java.beansBeanInfo接口:提供有关其 bean 的方法、属性、事件等显式信息
java.beans.Introspector类:extends Object为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。
java.beans.PropertyDescriptor类:描述 Java Bean 通过一对存储器方法导出的一个属性。
3.必须了解的异常:
java.lang.IllegalAccessException当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,抛出 IllegalAccessException。
java.lang.reflect.InvocationTargetException是一种包装由调用方法或构造方法所抛出异常的经过检查的异常。
javax.management.IntrospectionException在 MBean 的 introspection 期间出现的异常。
二:什么是内省?
内省(introSpector)是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。
例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。
Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包 java.beans 中。
我们又通常把javabean的实例对象称之为值对象(Value Object),因为这些bean中通常只有一些信息字段和存储方法,没有功能性方法。
总结:内省是 Java 语言对 Bean 类属性、事件的一种处理方法,而这些方法存放在包 java.beans 中。
三:什么是Javabean?
1. JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 的属性。
JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。
总结:现在学习的是没有用户界面,主要负责处理事务的JavaBean,而这个javabean是一种特殊的java类,它的方法要符合特殊的规则。只要一个类中含有get或is和set打头的方法,就可以将其当做JavaBean使用。
2.Javabean的一般格式:
int getAge();
void setAge(int age);
3.javabean的属性是根据其中的setter和getter方法来确定的 .,其实根据get和set的打头的方法后名缀得出来的:
后缀名书写规则:
如果第二个字母是小写的,则打第一个字母变成小写
例:getAge --> age ; setAge ---> age;
如果后缀全是小写则全小写:
例:gettime---> time; settime --> time;
如果后缀全是大写则全大写:
例:getCPU ---> CPU ; setCPU ---> CPU;
4.JavaBean的优点:
在javaEE开发中,经常要使用到JavaBean,很多环境就要按JavaBean方式进行操作。
Jdk中提供了对JavaBean进行操作的API,通过这套API能更方便的获取对象getx和setx的私有。
5.Javabean的用途之一在两个模块之间传递多个信息:
则可以将这些信息封装到JavaBean中,这种JavaBean的实例对象,通称值为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,这个方法就用javabean的属性中的setter和getter方法来确定的。
6.例:
获取ReflectPoint 中的x属性。
方式一:简单操作JavaBean。就是通过Eclipse自带的方法鼠标右键--->Refactor--->Extract method自动重构抽取方法。
方式二:采用遍历BeanInfo的所有属性方式来查找和设置某个ReflectPoint对象的X属性。在程序中把一个类当做javaBean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当做javaBean看的结果信息。
四:BeanUtil工具包
1. 由于对JavaBean属性的set和get操作的需求非常广泛和使用的频率很高,所以引入了专门针对JavaBean进行操作的工具类。BeanUtils工具包是由阿帕奇提供的。
2.如何使用beanUtils工具包:
1)导入BeanUtilS的jar工具包.(因为是工具类中方法是都是静态的)
2)在工程中导入工具jar包
方式一:右键项目--选择Properties---Java Build Path--选择Liberiers标签。AddExternal Jars--选择要导入的jar包。这样做有个问题就是如果jar路径发生变化。项目就不能使用到这个jar包。
方式二:把下载好的commons-beanutils-1.9.2解压文件中的jar在Eclipse中点击右键根目录,创建一个目录(点击new--》folder)名字加lib,再把jar包ctrl+v考入lib文件夹内,再在lib文件内的jar包中点右键--》buildPath-->Add to BuildPath.这样就可以使用了。这样做的好处:项目移动,jar随项目移动。
3)除了要导入BeanUtilS的jar工具包外还要导入阿帕奇的日志包commons-logging-1.2;
3.使用BeanUtils的好处:
1)BeanUtils把get和set的值当做字符串来操作的,但实际上JavaBean里面的类型不是字符串,这里就涉及到转换,而这个转换NeanUtils能自动完成,这就是BeanUtils第一个好处。
2)支持属性的级联操作。
例://BeanUtils的好处:
BeanUtils.setProperty(pt1, "brithday.time", "111");
System.out.println(BeanUtils.getProperty(pt1, "brithday.time"));
举例:
用BeanUtils提取ReflectPoint 中的X,brithday属性。
四:PropertyUtils工具包.
1.PropertyUtils与BeanUtils:
1)BeanUtils工具包中还有一个工具类PropertyUtils,用法跟BeanUtils一样。
2)区别:
1)BeanUtils会对JavaBean的属性的类型进行转换,如属性本身是integer,会转换为String。
2)PropertyUtils以属性本身的类型进行操作。
举例:
----------
一:基础内容
1.必须掌握的英语单词:
bean(豆类;豆子 );
JavaBean(对象,共享,JAVA类,模型);
info(信息);
Descriptor(描述符号)
Introspector(内省);
PropertyDescriptor(属性描述器 )
property(性质)
Properties(性能,道具,内容,属性,特性)
2.必须理解的类与接口:
java.beansBeanInfo接口:提供有关其 bean 的方法、属性、事件等显式信息
java.beans.Introspector类:extends Object为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。
java.beans.PropertyDescriptor类:描述 Java Bean 通过一对存储器方法导出的一个属性。
3.必须了解的异常:
java.lang.IllegalAccessException当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,抛出 IllegalAccessException。
java.lang.reflect.InvocationTargetException是一种包装由调用方法或构造方法所抛出异常的经过检查的异常。
javax.management.IntrospectionException在 MBean 的 introspection 期间出现的异常。
二:什么是内省?
内省(introSpector)是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。
例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。
Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包 java.beans 中。
我们又通常把javabean的实例对象称之为值对象(Value Object),因为这些bean中通常只有一些信息字段和存储方法,没有功能性方法。
总结:内省是 Java 语言对 Bean 类属性、事件的一种处理方法,而这些方法存放在包 java.beans 中。
三:什么是Javabean?
1. JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 的属性。
JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。
总结:现在学习的是没有用户界面,主要负责处理事务的JavaBean,而这个javabean是一种特殊的java类,它的方法要符合特殊的规则。只要一个类中含有get或is和set打头的方法,就可以将其当做JavaBean使用。
2.Javabean的一般格式:
int getAge();
void setAge(int age);
3.javabean的属性是根据其中的setter和getter方法来确定的 .,其实根据get和set的打头的方法后名缀得出来的:
后缀名书写规则:
如果第二个字母是小写的,则打第一个字母变成小写
例:getAge --> age ; setAge ---> age;
如果后缀全是小写则全小写:
例:gettime---> time; settime --> time;
如果后缀全是大写则全大写:
例:getCPU ---> CPU ; setCPU ---> CPU;
4.JavaBean的优点:
在javaEE开发中,经常要使用到JavaBean,很多环境就要按JavaBean方式进行操作。
Jdk中提供了对JavaBean进行操作的API,通过这套API能更方便的获取对象getx和setx的私有。
5.Javabean的用途之一在两个模块之间传递多个信息:
则可以将这些信息封装到JavaBean中,这种JavaBean的实例对象,通称值为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,这个方法就用javabean的属性中的setter和getter方法来确定的。
6.例:
获取ReflectPoint 中的x属性。
public class ReflectPoint { private int x; public int getX() { return x; } public void setX(int x) { this.x = x; } }
方式一:简单操作JavaBean。就是通过Eclipse自带的方法鼠标右键--->Refactor--->Extract method自动重构抽取方法。
import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.apache.commons.beanutils.BeanUtils; //这个类读取JavaBean对象的x属性。 public class IntroSpectorTest{ public static void main(String[] args)throws Exception { ReflectPoint pt1 = new ReflectPoint(3, 5); String propertyName = "x"; /*用普通方法获取X的值步骤: 1.首先把小写"x"变成大写"X"。如果"X"后面还有字母,则还要看第二个字母是大写还是小写。 然后用JavaBean书写规则 2.在"X"前面加入"get"变成"getX"这样就得到方法名。 3.在通过反射的方法,MethodGetX */ //通过内省的方式获取X的值: //用一个属性描述符的类 PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass()); //得到方法 Object retVal = getproperty(pt1, pd); System.out.println(retVal); //设置方法。 Object value = 7; setproperty(pt1, pd, value); } //通过Eclipse--->Refactor--->Extract method自动重构抽取方法。 private static void setproperty(ReflectPoint pt1, PropertyDescriptor pd, Object value) throws IllegalAccessException, InvocationTargetException { Method methodSetX = pd.getWriteMethod(); methodSetX.invoke(pt1,value); System.out.println(pt1.getX()); } //通过Eclipse--->Refactor--->Extract method自动重构抽取方法。 private static Object getproperty(Object pt1, PropertyDescriptor pd) throws IllegalAccessException, InvocationTargetException { Method methodGetX = pd.getReadMethod(); Object retVal = methodGetX.invoke(pt1); return retVal; } }
方式二:采用遍历BeanInfo的所有属性方式来查找和设置某个ReflectPoint对象的X属性。在程序中把一个类当做javaBean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当做javaBean看的结果信息。
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 IntroSpectorTest2 { public static void main(String[] args)throws Exception { ReflectPoint pt1 = new ReflectPoint(3, 5); String propertyName = "x"; PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass()); //得到方法 Object retVal = getproperty(pt1, propertyName); System.out.println(retVal); } private static Object getproperty(Object pt1, String propertyName) throws IllegalAccessException, InvocationTargetException, IntrospectionException { //创建对象关联 BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass()); //得到所有的属性描述 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); Object retVal = null; //对这个属性进行迭代 for(PropertyDescriptor pd1 : pds){ //如果属性跟参数的属性相等,就获取它的getX方法 if(pd1.getName().equals(propertyName)){ Method methodGetX = pd1.getReadMethod();//获取getX方法 retVal = methodGetX.invoke(pt1); break; } } return retVal; } }
四:BeanUtil工具包
1. 由于对JavaBean属性的set和get操作的需求非常广泛和使用的频率很高,所以引入了专门针对JavaBean进行操作的工具类。BeanUtils工具包是由阿帕奇提供的。
2.如何使用beanUtils工具包:
1)导入BeanUtilS的jar工具包.(因为是工具类中方法是都是静态的)
2)在工程中导入工具jar包
方式一:右键项目--选择Properties---Java Build Path--选择Liberiers标签。AddExternal Jars--选择要导入的jar包。这样做有个问题就是如果jar路径发生变化。项目就不能使用到这个jar包。
方式二:把下载好的commons-beanutils-1.9.2解压文件中的jar在Eclipse中点击右键根目录,创建一个目录(点击new--》folder)名字加lib,再把jar包ctrl+v考入lib文件夹内,再在lib文件内的jar包中点右键--》buildPath-->Add to BuildPath.这样就可以使用了。这样做的好处:项目移动,jar随项目移动。
3)除了要导入BeanUtilS的jar工具包外还要导入阿帕奇的日志包commons-logging-1.2;
3.使用BeanUtils的好处:
1)BeanUtils把get和set的值当做字符串来操作的,但实际上JavaBean里面的类型不是字符串,这里就涉及到转换,而这个转换NeanUtils能自动完成,这就是BeanUtils第一个好处。
2)支持属性的级联操作。
例://BeanUtils的好处:
BeanUtils.setProperty(pt1, "brithday.time", "111");
System.out.println(BeanUtils.getProperty(pt1, "brithday.time"));
举例:
import java.util.Date; public class ReflectPoint { private int x; private Date brithday = new Date(); public Date getBrithday() { return brithday; } public void setBrithday(Date brithday) { this.brithday = brithday; } public int getX() { return x; } public void setX(int x) { this.x = x; } }
用BeanUtils提取ReflectPoint 中的X,brithday属性。
import java.beans.PropertyDescriptor; import org.apache.commons.beanutils.BeanUtils; //这个类读取JavaBean对象的x属性。 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"; //用beanUtils工具包 System.out.println(BeanUtils.getProperty(pt1, "x")); BeanUtils.setProperty(pt1, "x", 9); System.out.println(pt1.getX()); //BeanUtils的好处: BeanUtils.setProperty(pt1, "brithday.time", "111"); System.out.println(BeanUtils.getProperty(pt1, "brithday.time")); }
四:PropertyUtils工具包.
1.PropertyUtils与BeanUtils:
1)BeanUtils工具包中还有一个工具类PropertyUtils,用法跟BeanUtils一样。
2)区别:
1)BeanUtils会对JavaBean的属性的类型进行转换,如属性本身是integer,会转换为String。
2)PropertyUtils以属性本身的类型进行操作。
举例:
//用BeanUtils工具包的工具类BeanUtils方法 BeanUtils.setProperty(hct, propertyName, "9");//set,9是String System.out.println(BeanUtils.getProperty(hct, propertyName));//get System.out.println(BeanUtils.getProperty(hct, propertyName).getClass().getName());//java.lang.String //BeanUtils工具包中的PropertyUtils的操作 PropertyUtils.setProperty(hct, propertyName, 9);//9是Integer System.out.println(PropertyUtils.getProperty(hct, propertyName)); System.out.println(PropertyUtils.getProperty(hct, propertyName).getClass().getName());//java.lang.Integer
相关文章推荐
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级
- JavaBean内省:认识JavaBean与内省、对JavaBean的内省操作、Beanutils工具包
- 黑马程序员——高新技术(内省、javaBean、BeanUtils工具)
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
- 黑马程序员--07.JavaBean--02【JavaBean的复杂内省操作】【第三方类库BeanUtils操作JavaBean】
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
- 黑马程序员——javabean、内省和BeanUtils
- 黑马程序员---JavaBean、內省以及第三方工具包BeanUtils的学习
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
- JAVA高新技术——JavaBean、内省、BeanUtils工具包
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
- Java高新技术:框架,类加载器方式,JavaBean,内省,BeanUtils工具包
- 黑马程序员——Java高新技术——内省JavaBean及BeanUtils的应用、注解等
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包
- 黑马程序员 十五、内省:JavaBean、 Beanutils、注解、泛型
- 内省—beanutils工具包 操作javabean属性
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性