内省IntroSpector
主要用于对javaBean的操作
javaBean是一个特殊的java类,主要用于传递数据信息,这种java 类中的方法主要用于访问私有的字段,且方法名符合某种特殊的规则。一道面试题:写出javaBean 的person 类
javaBean 的属性名由set get决定,一个类被当做javaBean 使用时,javaBean的属性是根据方法名推断出来的,看不到内部的成员变量,属性方法去掉set,get后的名称,就是javaBean的属性,如果属性第二个字母是小写,第一个字母也小写 Age->age
class person
{
private int x;
public void set(int age)
{
this.x=age;
}
public int get()
{
return x;
}
}
对javaBean 的简单的内省操作
如果两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean 中,这种JavaBean的实例对象称为值对象(Value Object)
这些信息在类中用私有的字段来存储,如果读取和设置这些字段值,javaBean 提供get set方法来确定将一个类变成javaBean ,在类中定义字段的set get属性方法
如果一个类符合javaBean的特点,可以当做普通的类来使用,但是当做JavaBean 使用,会带来额外的好处:
1,JavaEE 开发中经常使用JavaBean,很多环境要求使用JavaBean 操作
2,JDK 中提供了对javaBean进行操作的API,这套API就称为内省。如果用getX 去访问私有的x会很有难度,用内省这套API操作JavaBean 会更方便
读取javaBean 对象的x 属性
JavaBean 对象的类
public class ReflectPoint {
private int x;
public int y;
public ReflectPoint(int x, int y) {//alt+shift+s 生成源代码
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public String toString()
{
return str1+":"+str2+":"+str3;
}
}
读取x的属性并设置属性的值
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//获取ReflectPoint 这个javaBean 对象的x 值
//创建JavaBean 对象
ReflectPoint pt1=new ReflectPoint(3,5);
//用内省的方式获取属性值x
String propertyName="x";
PropertyDescriptor pd= new PropertyDescriptor(propertyName,pt1.getClass());//参数为属性名和类
Method methodGetX=pd.getReadMethod();//得到get 方法
Object revalue= methodGetX.invoke(pt1);
System.out.println(revalue);
//设置属性的值
PropertyDescriptor pd2= new PropertyDescriptor(propertyName,pt1.getClass());//参数为属性名和类
Method methodSetX=pd.getWriteMethod();//得到set 方法
methodSetX.invoke(pt1,7);
System.out.println(pt1.getX());
}
对javaBean 复杂的内省操作
采用遍历BeanInfo的所有属性方式来查找和设置某个ReflectPoint对象x 的属性值。把一个类当做javaBean来看就是调用
IntroSpector.getBeanInfo方法,得到的BeanInfo 对象封装了把这个类当做JavaBean看的结果信息
BeanInfo beaninfo=Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds=beaninfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds)
{
if(pd.getName().equals(propertyName))
{
Method methodSetX=pd.getWriteMethod();
methodSetX.invoke(pt1, value);
break;
}
}
使用BeanUtils 工具包操作JavaBeanBeanUtils 工具包
eclipse 导入工具包,工具包都是jar包形式,将jar包放在工程内部
1,解压
2,工程上新建folder >lib>将需要的jar包复制粘贴至这个文件夹中
3,右击jar 包>build path>add to build path(变成小奶瓶图标)
4,加入logging 导入build path(日志开发包)
//用BeanUtil 获取pt1的x的属性值,需要添加日志开发包
System.out.println(BeanUtils.getProperty(pt1, "x"));
BeanUtils.setProperty(pt1, "x", "22");//注意BeanUtils属性和属性设置的值是String 类型,BeanUtils 自身将其转换成相应类型
System.out.println(pt1.getX());
BeanUtils.setProperty(pt1, "birthday.time", "111");
System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));
PropertyUtils.setProperty(pt1, "x", 27);//注意值的类型int型
System.out.println(PropertyUtils.getProperty(pt1, "x"));