疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java高薪技术JavaBean


 

  

  一、JavaBean

  * 通过内省引入JavaBean:内省对应的英文全程是IntroSpector。在Java中,其作用主要针对JavaBean进行操作。

  (一)概述

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

  (2)如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)

  (3)JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。

  如方法名为setId,则中文意思是设置Id,getId也是如此;去掉set或者get前缀,剩余部分就是属性名称。如果剩余部分的第二个字母小写,则把剩余部分改为小写。如:

  Ø getAge/setAge-->age;

  Ø gettime-->time;

  Ø setTime-->time;

  Ø getCPU-->CPU;

  总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。

  (二)JavaBean好处

  符合JavaBean特点的类可以当作普通类一样使用,把它当JavaBean用会带来一些额外的好处:

  1、在Java EE开发中,经常要使用到JavaBean,很多环境就要求按JavaBean方式进行操作。

  2、JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。用内省这套api操作JavaBean比用普通类的方式更方便。

  (三)内省的简单操作

  1 import java.beans.BeanInfo;

  2 import java.beans.IntrospectionException;

  3 import java.beans.Introspector;

  4 import java.beans.PropertyDescriptor;

  5 import java.lang.reflect.InvocationTargetException;

  6 import java.lang.reflect.Method;

  7 import java.util.Map;

  8 import org.apache.commons.beanutils.BeanUtils;

  9 import org.apache.commons.beanutils.PropertyUtils;

  10 public class IntroSpectorTest {

  11 public static void main(String[] args) throws Exception {

  12 ReflectPoint pt1 = new ReflectPoint(3,5);

  13 String propertyName = "x";

  14 Object retVal = getProperty(pt1, propertyName);

  15 Object value = 7;

  16 setProperties(pt1, propertyName, value);

  17 System.out.println(pt1.getX());

  18 }

  19 private static void setProperties(Object pt1, String propertyName,

  20 Object value) throws IntrospectionException,

  21 IllegalAccessException, InvocationTargetException {

  22 PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass());

  23 Method methodSetX = pd2.getWriteMethod();

  24 methodSetX.invoke(pt1,value);

  25 }

  26 private static Object getProperty(Object pt1, String propertyName)

  27 throws IntrospectionException, IllegalAccessException,

  28 InvocationTargetException {

  29 PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());

  30 Method methodGetX = pd.getReadMethod();

  31 Object retVal = methodGetX.invoke(pt1);

  32 return retVal;

  33 }

  34 }

  (四)对JavaBean的复杂内省操作

  1、操作步骤:

  (1)在IntroSpector类中有getBeanInfo(Class cls)的方法,通过此方法获取BeanInfo实例。参数是相应对象的字节码,即Class对象。

  (2)BeanInfo类中有getPropertyDescriptors()的方法,可获取所有的JavaBean类中的属性信息,返回一个PropertyDescriptor[]。

  (3)在通过遍历的形式,获取与想要的那个属性信息。

  2、以getX为例,步骤实现的代码示例:

  1 private static Object getProperty(Object pt1, String propertyName)

  2 throws IntrospectionException, IllegalAccessException,

  3 InvocationTargetException {

  4 BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());

  5 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

  6 Object retVal = null;

  7 for(PropertyDescriptor pd : pds){

  8 if(pd.getName().equals(propertyName))

  9 {

  10 Method methodGetX = pd.getReadMethod();

  11 retVal = methodGetX.invoke(pt1);

  12 break;

  13 }

  14 }

  15 return retVal;

  16 }

  (五)BeanUtils工具包

  1、beanutils包下载及添加

  (1)下载地址:http://commons.apache.org/proper/commons-beanutils/

  (2)两种添加方式:

  Ø 方式1:项目上“右键”—— Build Path —— Configure Build Path —— 选择Liberiers标签 —— AddExternal Jars —— 选择要导入的jar包。这种方式属于“本地添加”,存在的问题就是如果jar路径发生变化,项目就不能使用到这个jar包。

  Ø 方式2:在项目中建立一个lib目录,专门用于存放项目所使用到的jar工具包。将要使用到jar包复制进来。在Eclipse的Package Explorer面板中,在jar文件上点右键——选择Builder Path——Add to BiuldPath,添加完成。这样做的好处:jar随项目一起移动。

  2、可能出现的问题

  问题:添加beanutils工具包后,可能会出现org/apache/commons/logging/logFactory找不到

  解决方法:下载commons-logging.jar,同beanutils添加步骤一样,添加日志jar包即可。

  3、BeanUtils工具应用,代码示例

  1 import org.apache.commons.beanutils.BeanUtils;

  2 import org.apache.commons.beanutils.PropertyUtils;

  3 public class IntroSpectorDemo {

  4 public static void main(String[] args) throws Exception {

  5 reflectPoint rp1 = new reflectPoint(3,5);

  6 String propertyName = "x";

  7 // 用BeanUtils工具包的方法

  8 System.out.println(BeanUtils.getProperty(rp1, "x"));//get

  9 BeanUtils.setProperty(rp1, "x", "9");//set

  10 System.out.println(rp1.getX());

  11 }

  12 }

  4、BeanUtils和PropertyUtils的区别?

  BeanUtils工具包中还有一个工具类PropertyUtils,用法跟BeanUtils一样。区别在于:

  (1)BeanUtils会对JavaBean的属性的类型进行转换,如属性本身是integer,会转换为String。

  (2)PropertyUtils以属性本身的类型进行操作。

  1 //用BeanUtils工具包的工具类BeanUtils方法

  2 BeanUtils.setProperty(rp1, "x", "9");//set,9是String

  3 System.out.println(BeanUtils.getProperty(rp1, "x"));//get

  4 System.out.println(BeanUtils.getProperty(rp1, "x").getClass().getName

  ());//java.lang.String

  5

  6 //BeanUtils工具包中的PropertyUtils的操作

  7 PropertyUtils.setProperty(rp1, "x", 9);//9是Integer

  8 System.out.println(PropertyUtils.getProperty(rp1, "x"));

  9 System.out.println(PropertyUtils.getProperty(rp1,"x").getClass().getName

  ());//java.lang.Integer