一、内省(IntroSpector)——>JavaBean

1、内省

1)、Java内省机制主要用于对javabean进行操作

2)、Java 内省机制的定义

内省(Introspector)是Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter/setter方法,通过这些API可以使你不需要了解这个规则(但你最好还是要搞清楚),这些API存放于包java.beans中。

一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。

2、JavaBean

              1)、有set,get方法的java类,称之为JavaBean类。

2)、JavaBean的名称特点

去掉get、set就是bean属性,如果第二个字母是小写的,则把第一个字母变成小的。例如:

Gettime——>time

setTime——>time

getCPU——>CPU

              3)、使用JavaBean的好处

使用如果一个类符合JavaBean的特点,可以被当做JavaBean类处理,也可以被当做普通类处理。但因为jdk提供了内省( 对JavaBean进行操作的一套API),使用内省操作符合JavaBean规则的类,将使我们的操作更加方便。

JavaBean的使用很广泛。

二、JavaBean的操作

       1、私有属性,并提供访问方式

1)、开发时一般会为类的属性添加set、get方法,将其设为private。增强代码的健壮性。

              2)、eclipse添加set、get方法

                     Source——>Generate Getters and Setters…。快捷键Alt + Shift + s 。

       2、用内省获取和设置属性值

过程“x”——>“X”——>“getX”——> MethodGetX

             

【
                     public class  X_Value{
       private int x ;
       public void setX(int x){
       this.x = x ;
}
public int getX(){
       return x ;
}
}
】

1)、JavaBean类属性——>PropertyDescriptor对象 。

JavaBean的属性由set、get方法组成,PropertyDescriptor是JavaBean的属性描述符,即PropertyDescriptor中有set,get方法。

步骤

1将要得到的JavaBean类的属性封装成字串

       2利用PropertyDescriptor的构造函数建立PropertyDescriptor对象

示例:

     

String propertyX = “x”
PropertyDescriptor pd =
new PropertyDescriptor(propertyX , JavaBean类对象.getClass()) ;

2)、PropertyDescriptor中的方法

       a)、getReadMethod()

用以得到PropertyDescriptor中的get方法。其返回值类型是Method。

示例:

Method methodGetX = pd.getReadMethod() ;
       Object retVal = methodGetX.invoke(JavaBean类对象);
//这里得到的值就是我们要得到的属性值
b)、getWriteMethod()
示例:
Method methodSetX
methodGetX.invoke(JavaBean类对象,值);
3)、示例代码
              【
                     Public class Demo{
                            Public static void main(String [] args){
X_Value x_value
x_value.setX(5) ;
       String propertyName = “ x ”
       PropertyDescripror pd =
new PropertyDescripror(propertyName, x_value .getClass()) ;
       //得到get方法,并取得值
Method methodGetX = pd.getReadMethod() ;
       Object retVal = methodGetX.invoke(x_value);
       //得到set方法,并设值
Method methodSetX = pd.getWriteMethod() ;
methodGetX.invoke(x_value,7);
}
}
】

4)、重构抽取方法

       选中要抽取的代码——>右键——>Refactor——>Extract Method…

       3、 类BeanInfo——>Bean类所有的属性描述

             

       

BeanInfo beanInfo = Introspector.getBeanInfo(x_value.getClass()) ;
              PropertyDescriptor[] pds = beanInro.getPropertyDescriptors() ;
              Object retVal = null ;
              for(PropertyDescriptor pd : pds){
                     if(pd.getName().equals(propertyName)){
       Method methodGetX = pd.getReadMethod() ;
       retVal = methodGetX.intvoke(x_value)      
       break ;
}
}

三、BeanUtils工具包

1、BeanUtils工具包由阿帕奇公司提供

2、BeanUtils和工程的关联

a)下载

b)解压

c)导包:——>

i.本地导入

复制要导入的包—> 选中工程右键单击—>Build Path  —>ConfigureBuild Path Add External JARS 

这样导入的包不便于转移,因为这个包在本地,当工程转移到其他电脑,包就无法使用了。

ii.把jar包放在工程内部,便于转移

在工程下新建文件夹(一般起名lib)—>将jar包复制粘贴到文件夹—>点右键加到Build Path—>Add Build Path(包名称前的图标会变成小奶瓶)

              d)、logging日志包。

BeanUtils会用到logging日志包,所以要将其导入才能正常使用BeanUtils中的内容。

3、使用

a)类BeanUtils 

i.方法getProperty(JavaBean类对象,String属性名)。获取属性值。

ii.方法setProperty(JavaBean类对象,Stirng 属性名,String 值)。设置属性值

iii.使用示例

public class BirthDay{
       private Date birthday ;
/*Date本省就有setTime方法 。birthday是一个复合属性。birthday还有time属性*/
}
public
       public static void main(String[] args){
       BirthDay bd = new BirthDay() ;
/*如果这一里没有初始化,会报异常No bean specified ,意思是没有bean设定*/
       //用javaBean操作bd
       BeanUtils. setProperty(bd,”birthday.time”,”111”) ;
       BeanUtils.getProperty(bd,”birthday.time”)
}
}

 

b)、其他知识点

1)、JavaBean的特点:支持复合属性的多级操作。

2)、jdk1.7的新特性:

Map的定义:Map map = { name :”zxx”

3)、操作属性值得不同

JavaBean是以字符串的方式操作属性值,而property是以对象属性本身的类型来操作