Java高新技术:内省

来源:互联网 发布:怎么在手机淘宝买东西 编辑:程序博客网 时间:2024/06/05 10:11

第一部分:概述

        Java类中的属性一般都有set与get方法,为了方便开发者更好的操作这些属性,SUN公司开发了一套API,被业界内称为:内省(IntroSpector)。内省的出现有利于了对类对象属性的操作,简化书写。

第二部分:JavaBean

一、基本介绍

1、JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有字段,且方法名符合某种命名规则。每个javabean都会有一个无参的构造方法。

2、如果想要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的示例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储。

3、JavaBean的属性是根据其中的setter与getter方法来确定的,而不是根据其中的成员变量。一个类被当做JavaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量(已被私有)。

      属性名获取规则:如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小写的。如:

setId()的属性名:id

isLast()的属性名:last (boolean型的javabeand的getter方法的get要改为is)

setCPU()的属性名:CPU

getUPS()的属性名:UPS

二、JavaBean存在的优点

        一个符合JavaBean特点的类可以当做普通类进行使用,但把它当做JavaBean用需要带来一些额外的好处,好处如下:

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

2、用内省这套API操作JavaBean比用普通类的方式更为方便。


第三部分:对JavaBean的内省操作

一、简单操作

1、PropertyDescriptor类(java.beans)

PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。

构造函数:

PropertyDescriptor(String propertyName, Class<?> beanClass) 
          通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor

常用方法:

Method getReadMethod()        获得应该用于读取属性值的方法 
Method getWriteMethod()        获得应该用于写入属性值的方法

2、示例代码
package day.day18;import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/*对JavaBean的简单内省操作通过java.beans包中的PropertyDescripthorvoid setName(String name)属性name的setterint getName()属性name的getter自己处理: "name" → "getName"  → MethodGetNameJavaBean:  "name" → PropertyDescriptor  → getReadMethod */public class JavaBeanDemo {public static void main(String[] args) throws Exception{Person p = new Person();String propertyName = "name";Object obj = "点点";setProperty(p, propertyName, obj);System.out.println(p.getName());Object retVal = getProperty(p, propertyName);System.out.println(retVal);//必须要有这句,即被使用。Extract method才有返回值}//功能:获取属性public static Object getProperty(Object p, String propertyName)throws IntrospectionException, IllegalAccessException,InvocationTargetException {//为符合标准 Java 约定的属性构造一个 PropertyDescriptorPropertyDescriptor pd = new PropertyDescriptor(propertyName,p.getClass());//获取 获取属性的方法Method methodGet = pd.getReadMethod();//read//调用指定对象中该属性的值Object retVal = methodGet.invoke(p);return retVal;}//功能:设置属性public static void setProperty(Object p, String propertyName, Object obj)throws IntrospectionException, IllegalAccessException,InvocationTargetException {//为符合标准 Java 约定的属性构造一个 PropertyDescriptorPropertyDescriptor pd = new PropertyDescriptor(propertyName,p.getClass());//获取 设置属性的方法Method methodWrite = pd.getWriteMethod();//write//将指定的值设定到指定对象的 指定属性上methodWrite.invoke(p, obj);}}

二、复杂操作

1、Introspector类(java.beans)

        Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。 

常用方法:

static BeanInfo getBeanInfo(Class<?> beanClass) 
          在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件

2、BeanInfo接口(java.beans)

         希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类,该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。 

常用方法:

PropertyDescriptor[] getPropertyDescriptors()        描述受此 bean 支持的可编辑属性的 PropertyDescriptor 数组

PropertyDescriptor类中:(父类继承)

public String getName()        获得此特性的编程名称 

3、示例代码

package day.day18;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;/*对JavaBean的复杂内省操作通过java.beans包中的BeanInfo接口采用遍历BeanInfo的所有属性方式来查找和设置指定对象的 属性在程序中把该类当做JavaBean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息 */public class JavaBeanTest {public static void main(String[] args) throws Exception {String propertyName = "age";Person p = new Person();Object retVal = getProperty(p, propertyName);System.out.println(retVal);//必须要有这句,即被使用。Extract method才有返回值}//功能:获取属性public static Object getProperty(Object p, String propertyName)throws IntrospectionException, IllegalAccessException,InvocationTargetException {//在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);//描述受此 bean 支持的可编辑属性的 PropertyDescriptor 数组PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();Object retVal = null;//遍历数组for(PropertyDescriptor pd:pds){//若属性名称和知道的这个名称相同,则获取方法,同通过反射的方式调用该方法if(pd.getName().equals(propertyName)){Method methodGet = pd.getReadMethod();retVal = methodGet.invoke(p);//调用无参的方法,int...break;}}return retVal;}}


第四部分:beanutils工具包操作JavaBean

一、概述

beanutils工具包是Apach开发的一个工具包,该包中的提供的了许多工具类,方便对JavaBean的操作。使用时先将beanutils与logging的jar包通过eclipse导入工程、并设置好path后便可以使用。

二、BeanUtils工具类

1、该类中的方法都是静态方法,可以直接用类名调用。

2、常用方法:

static String getProperty(Object bean, String name)        获取bean上的指定属性的值
static void setProperty(Object bean, String name, Object value)        设置bean上指定属性


static void copyProperties(Object dest, Object orig)         把一个对象上的属性拷贝到另外一个对象上去
static void copyProperty(Object bean, String name, Object value) 
static Map<String,String> describe(Object bean)       将JavaBean属性转换成Map集合
static void populate(Object bean, Map<String,? extends Object> properties)        将Map集合转换成JavaBean

注意:

1)BeanUtils支持对多级属性链的操作

2)BeanUtils是以字符串的形式对JavaBean进行操作,网页开发中常用(需要类型转换时)

3、示例代码

package day.day18;import org.apache.commons.beanutils.BeanUtils;/* * apache公司提供的外部工具包:BeanUtils(全是静态方法) * BeanUtils 是以字符串的形式操作JavaBeanstatic StringgetProperty(Object bean, String name)        获取bean上的指定属性的值static voidsetProperty(Object bean, String name, Object value)        设置bean上指定属性 */public class BeanUtilsDemo {public static void main(String[] args) throws Exception{Person p = new Person();//以字符串的形式进行设置BeanUtils.setProperty(p, "age", "30");//以属性自身的类型进行设置BeanUtils.setProperty(p, "age", 24);//返回的值都被强转为字符串String retVal = BeanUtils.getProperty(p, "age");System.out.println(retVal);/* * 在Person类中加一个 private 属性  Date date = new Date(); * 设置setter与getter * public Date getDate(){ * return date; * } * date对象中也有getTime()与setTime()的方法。 *///对多级属性链进行操作BeanUtils.setProperty(p, "date.time", 110);BeanUtils.setProperty(p, "date.time", "110");String retValue = BeanUtils.getProperty(p, "date.time");System.out.println(retValue);}}

三、PropertyUtils工具类

1、该类中的方法也全是静态的。

2、常用方法:

static void setProperty(Object bean, String name, Object value)  
static Object getProperty(Object bean, String name) 

注意:

1)也支持对多级属性的操作

2)PropertyUtils以属性本身的类型进行操作(不想进行类型转换)

3、示例代码

package day.day18;import java.lang.reflect.InvocationTargetException;import org.apache.commons.beanutils.PropertyUtils;/* * PropertyUtils只能以属性本身的类型进行操作(不想进行类型转换) *static void setProperty(Object bean, String name, Object value)   *static Object getProperty(Object bean, String name)   *  */public class PropertyUtilsDemo {public static void main(String[] args) throws Exception {Person p = new Person();//PropertyUtils.setProperty(p, "age", "23");PropertyUtils.setProperty(p, "age", 23);//支持多级属性PropertyUtils.setProperty(p, "date.time", 23);//返回值 java.lang.IntegerSystem.out.println(PropertyUtils.getProperty(p, "age").getClass().getName());}}

0 0
原创粉丝点击