java基础加强03 内省和JavaBean

时间:2021-05-08 19:40:39

一、内省(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 = pd.getWriteMethod() ;

methodGetX.invoke(JavaBean类对象,值);

3)、示例代码

              

                     Public class Demo{

                            Public static void main(String [] args){

X_Value x_value = new 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 class Demo{

       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 ,age:18} ;

3)、操作属性值得不同

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