黑马程序员—Java基础加强(JavaBean)

来源:互联网 发布:黑暗之魂3武器数据库 编辑:程序博客网 时间:2024/05/21 03:54

------- android培训、java培训、期待与您交流! ----------

 

 

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(ValueObject,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的settergetter方法来确定的,而不是根据其中的成员变量。如果方法名为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和7ReflectPoint refp = new ReflectPoint(3, 7);//定义需要获取的属性为xString 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培训、期待与您交流! ----------
0 0
原创粉丝点击