黑马程序员—Java基础加强(JavaBean)
2014-04-16 16:26
495 查看
------- android培训、java培训、期待与您交流! ----------
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(ValueObject,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
* 内省:IntroSpector--》检查,视察--》主要用于对JavaBean进行操作。
* JavaBean类中方法的名称符合某种特定的规则。
*
* 比如,int getAge() void setAge(int age)
*
* 符合这种特定规则的类我们称之为JavaBean。
* JavaBean的属性是根据set和get方法看出来的
*
* JavaBean类怎么定义呢? 就是setAge()和getAge()去掉set和get之后就是JavaBean类的属性名字。
* 比如 setAge--》Age Age就是JavaBean的属性名
* 属性名字的前提,看Age这个单词,如果这个单词的第二个字母是小写,那么属性名字单词的首字母也应该小写。
* 如果第二个单词字母是大写的,那么属性名字单词的首字母也必须是大写的。
一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:
在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的方式更方便。
一个简单的JavaBean类的定义:
BeanUtils:
1.什么是BeanUtils:
BeanUtils主要提供了对于JavaBean进行各种操作。
2.BeanUtils的作用:
在一般的写bean组件的时候,都必须要写setter和getter方法,当然假如我们事先已经知道bean的相关属性和方法,写bean是比较简单的,但是组件太多的时候,重复编写经常是枯燥乏味令人厌烦的。但当有些时候我么需要调用动态对象的属性的时候,我们应该怎么来设定和获取对象的属性呢?BeanUtils就可以帮助我们来解决这个问题。它需要Jakarta-Commons -Collections包和Jakarta-Commons -logging包的支持。
3.
org.apache.commons.beanutils:
这个包主要提供用于操作JavaBean的工具类,Jakarta-Common-BeanUtils的主要功能都在这个包里实现。
BeanUtils可以直接get和set一个属性的值。它将property分成3种类型:
1Simple——简单类型,如Stirng、Int……
(对于Simple类型,第二个参数直接是属性名即可,详见代码)
2Indexed——索引类型,如 数组、arrayList……
(对于Indexed,则为“属性名[索引值]”,注意这里对于ArrayList和数组都可以用一样的方式进行操作,详见代码)
3Maped——这个不用说也该知道,就是指Map,比如HashMap……
(对于Map类型,则需要以“属性名(key值)”的形式,详见代码)
访问不同类型的数据可以直接调用函数getProperty和setProperty。它们都只有2个参数,第一个是JavaBean对象,第二个是要操作的属性名
用内省和BeanUtils操作JavaBean的代码体现:
------- android培训、java培训、期待与您交流! ----------
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(ValueObject,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
* 内省:IntroSpector--》检查,视察--》主要用于对JavaBean进行操作。
* JavaBean类中方法的名称符合某种特定的规则。
*
* 比如,int getAge() void setAge(int age)
*
* 符合这种特定规则的类我们称之为JavaBean。
* JavaBean的属性是根据set和get方法看出来的
*
* JavaBean类怎么定义呢? 就是setAge()和getAge()去掉set和get之后就是JavaBean类的属性名字。
* 比如 setAge--》Age Age就是JavaBean的属性名
* 属性名字的前提,看Age这个单词,如果这个单词的第二个字母是小写,那么属性名字单词的首字母也应该小写。
* 如果第二个单词字母是大写的,那么属性名字单词的首字母也必须是大写的。
一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:
在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的方式更方便。
一个简单的JavaBean类的定义:
//一个简单的javaBean类的写法 class Person { //成员属性 private String name; private int age; //构造方法 public Person(){ this.name = name; this.age = age; } //getName方法,获取name属性的值 public String getName(){ return name; } //getAge方法,获取age属性的值 public int getAge(){ return age; } //setName方法,设置name属性的值 public void setName(String name){ this.name = name; } //setAge方法,设置age属性的值 public void setAge(int age){ this.age = age; } }
BeanUtils:
1.什么是BeanUtils:
BeanUtils主要提供了对于JavaBean进行各种操作。
2.BeanUtils的作用:
在一般的写bean组件的时候,都必须要写setter和getter方法,当然假如我们事先已经知道bean的相关属性和方法,写bean是比较简单的,但是组件太多的时候,重复编写经常是枯燥乏味令人厌烦的。但当有些时候我么需要调用动态对象的属性的时候,我们应该怎么来设定和获取对象的属性呢?BeanUtils就可以帮助我们来解决这个问题。它需要Jakarta-Commons -Collections包和Jakarta-Commons -logging包的支持。
3.
org.apache.commons.beanutils:
这个包主要提供用于操作JavaBean的工具类,Jakarta-Common-BeanUtils的主要功能都在这个包里实现。
BeanUtils可以直接get和set一个属性的值。它将property分成3种类型:
1Simple——简单类型,如Stirng、Int……
(对于Simple类型,第二个参数直接是属性名即可,详见代码)
2Indexed——索引类型,如 数组、arrayList……
(对于Indexed,则为“属性名[索引值]”,注意这里对于ArrayList和数组都可以用一样的方式进行操作,详见代码)
3Maped——这个不用说也该知道,就是指Map,比如HashMap……
(对于Map类型,则需要以“属性名(key值)”的形式,详见代码)
访问不同类型的数据可以直接调用函数getProperty和setProperty。它们都只有2个参数,第一个是JavaBean对象,第二个是要操作的属性名
用内省和BeanUtils操作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; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; public class IntroSpectorTest { public static void main(String[] args) throws Exception { //创建ReflectPoint的对象,传入参数x、y的值为3和7 ReflectPoint refp = new ReflectPoint(3, 7); //定义需要获取的属性为x String propertyName = "x"; //调用getProperty方法,传入对象和属性名称 Object retval = getProperty(refp, propertyName); //打印返回结果 System.out.println(retval); //定义setProperty的参数 Object value = 9; //调用setProperty方法,传入要获取的对象,属性名称,和值 setProperty(refp, propertyName, value); //打印被设置后的x值 System.out.println(refp.getX()); //JDK1.7的新特性,BeanUtils可以设置Map集合中的元素,而且他们之间还可以进行相互转换 // Map map = (name:"itcast", age:18); // BeanUtils.setProperty(map, "name", "itheima"); //BeanUtils的好处:支持属性链,属性可以一级一级的连接起来 BeanUtils.setProperty(refp, "birthday.time", 5667); System.out.println(BeanUtils.getProperty(refp, "birthday.time")); //BeanUtils工具的好处:可以自动进行类型转换。是以字符串的形式对JavaBean进行操作。 BeanUtils.setProperty(refp, "x", 57); System.out.println(BeanUtils.getProperty(refp, "x")); //如果数据不想被转换,或者BeanUtils转换不准确,可以用到下面的PropertyUtils这个不会转换数据类型 //他是以属性本身的类型进行操作的 PropertyUtils.setProperty(refp, "x", 19); System.out.println(PropertyUtils.getProperty(refp, "x")); } //setProperty方法,该方法需要调用者传入被操作的对象,要获取的字段和要设置的值 private static void setProperty(ReflectPoint refp, String propertyName, Object value) throws IntrospectionException, IllegalAccessException, InvocationTargetException { //把refp对象的类当成是一个JavaBean类进行操作,获取propertyName字段的描述 PropertyDescriptor prop = new PropertyDescriptor(propertyName, refp.getClass()); //获得应该用于读取属性值的方法。 Method methodSetX = prop.getWriteMethod(); // 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 methodSetX.invoke(refp, value); } //getProperty方法 private static Object getProperty(Object refp, String propertyName) throws IntrospectionException, IllegalAccessException, InvocationTargetException { // //把refp对象的类当成是一个JavaBean类进行操作,获取propertyName字段的描述 // PropertyDescriptor prop = // new PropertyDescriptor(propertyName, refp.getClass()); // //获得应该用于写入属性值的方法。 // Method methodGetX = prop.getReadMethod(); // //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 // Object retval = methodGetX.invoke(refp); BeanInfo bei = Introspector.getBeanInfo(refp.getClass()); PropertyDescriptor[] prods = bei.getPropertyDescriptors(); Object retval = null; for (PropertyDescriptor prod : prods) { if (prod.getName().equals(propertyName)) { Method methodGetX = prod.getReadMethod(); retval = methodGetX.invoke(refp); break; } } //返回要获取的属性字段的值 return retval; } }
------- android培训、java培训、期待与您交流! ----------
相关文章推荐
- 黑马程序员 java基础加强--内省与javaBean
- 黑马程序员-Java基础加强-内省→了解JavaBean
- 黑马程序员_张孝祥_Java基础加强_JavaBean、内省
- 黑马程序员--Java基础加强--10.【PropertyDescriptor操作JavaBean VS 反射操作Java类】【个人总结】
- 黑马程序员_JAVA基础加强——JavaBean内省和类加载器
- 黑马程序员_Java基础加强第二天——内省/JavaBean
- 黑马程序员java学习<基础加强>—JavaBean
- 【黑马程序员】java基础加强------------------javabean与内省操作
- 黑马程序员_Java基础加强反射
- 黑马程序员--Java基础加强--09.【MyEclipse的class文件所在的目录配置】【相对路径解析】【个人总结】
- 黑马程序员----java基础加强(1)
- 黑马程序员__JAVA基础加强--类加载器和代理总结
- 黑马程序员_Java基础加强_jdk1.5重要新特性详解
- 黑马程序员--Java基础加强--13.利用反射操作泛型II【TypeVariable】【GenericArrayType】【WildcardType】【Type及其子接口的来历】【个人总结】
- 黑马程序员__JAVA基础加强__高新技术(三)
- 黑马程序员-Java基础加强之反射
- 黑马程序员_张孝祥_Java基础加强_类加载器
- 黑马程序员_java基础加强3
- 黑马程序员—Java基础加强(注解)
- 黑马程序员—Java基础加强—(枚举)