一、内省(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是以对象属性本身的类型来操作