java之 内省

来源:互联网 发布:城市轨道交通大数据 编辑:程序博客网 时间:2024/05/16 07:21

------- android培训、java培训、期待与您交流! ----------

内省(IntroSpector)这个类是用来操作JavaBean操作的类。

那么什么是JavaBean呢?JavaBean其实就是一种用于进行数据传递的类,这些数据封装在私有的成员变量中,通过符合规则的方法,来设置和获取这些私有变量。

因为通常要在模块之间是用JavaBean来传递数据,那么我们也把JavaBean的实例对象成为值对象(Value Object)简称VO。

在JavaBean中的方法的规则一般是:

如果属性的名为:private int age 那么 设置和获取的它值的方法为:setAge(int age)  int getAge()

如果属性的名为:private String NAME 那么设置和获取它值的方法为: setNAME(String name)  String getNAME()、

因为JavaBean中的属性都是私有的,因此我们只能够通过这种符合规则的方法来判断这个属性的名称

我们可以利用PropertyDescriptor类来进行方便的操作JavaBean类:

这个类是用来描述JavaBean中的属性的。具体看下面例子。

例如有个person类 我们当初JavaBean类来看待:

public class person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private int age;

}

public class IntroSpectorTest1 {
public static void main(String[] args)throws Exception{
person p=new person();
String fieldName="name";
showProperty(p, fieldName);
}


private static void showProperty(person p, String fieldName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {

//它的构造方法中要求传入的参数为:当做JavaBean类来看待的类中的属性名称,第二个参数为这个JavaBean类的Class对象
PropertyDescriptor pdp=new PropertyDescriptor(fieldName,p.getClass());
//通过这个属性获取到设置这个属性的方法
Method mtd=pdp.getWriteMethod();
mtd.invoke(p, "小明");

//获取到获取这个属性值的方法
Method mtd1=pdp.getReadMethod();

//打印这个属性值。
System.out.println(mtd1.invoke(p));
}
}

此外我们还可以使用:IntroSpector类的getBeanInfo()方法来获取到BeanInfo对象。

这个BeanInfo是用来描述将这个JavaBean类的结果。

例如:还是这个person类:

public class IntroSpectorTest1 {
public static void main(String[] args)throws Exception{
person p=new person();
//下面将person类当做JavaBean来看待
String fieldName="name";
//showProperty(p, fieldName);
//通过IntroSpector的getBeanInfo方法获取到BeanInfo对象
BeanInfo beaninfo=Introspector.getBeanInfo(p.getClass());
//通过这个BeanInfod对象获取到这个JavaBean类的所有属性
PropertyDescriptor[] pdps=beaninfo.getPropertyDescriptors();
for(PropertyDescriptor pdp: pdps){//遍历这个JavaBean类中的所有属性
if(pdp.getName().equals(fieldName)){//如果是自己所需要的属性那么就操作
Method mtd=pdp.getWriteMethod();
mtd.invoke(p, "小明");
Method mtd1=pdp.getReadMethod();
System.out.println(mtd1.invoke(p));
break;
}
}
}

另外还可以使用BeanUtils工具将更加简便:

例如:

person p=new person();
//下面将person类当做JavaBean来看待
person p=new person();
//showProperty(p, fieldName);
//showBeanInfo(p, fieldName);

//通过BeanUtils的静态方法设置某个对象的某个属性的值

BeanUtils.setProperty(p,"name","小明");

//获取指定对象的指定属性的值
System.out.println(BeanUtils.getProperty(p, "name"));

//通过BeanUtils的静态方法设置某个对象的某个属性的值

BeanUtils.setProperty(p,"age","12");//注意这个方法是使用字符串的形式赋值。

//获取指定对象的指定属性的值
System.out.println(BeanUtils.getProperty(p, "name"));//这个方法也是按照字符串的形式获取值

此外BeanUtils还有复合属性赋值和获取的功能。

复合属性就是,这个属性是一个对象,这个属性的类型也是一个对象,例如:Date dd =new Date();

这个dd就是个复合属性,因为它的类型是date Date类中有个setTime的方法,复合javaBean的格式,

因此可以为Date类的time属性赋值。

person p=new person();

格式例如: BeanUtils.setProperty(p,"dd.time","999");

BeanUtils的功能还有很多,将JavaBean转成Map还能转回来,还能为MAP集合设置键值对等方法。
此外如果我们操作JavaBean类的时候,如果想要设置和或者时不按字符串的形式,那么我们可以使用
PropertyUtils类。它同样有setProperty和getProperty方法。
它是以这个属性的类型来操作的。
























0 0