JavaBean是一种特殊的java类,这种类的属性都必须拥有get和set方法,这样可以通过方法来获得类中的属性值或者进行一些修改。它主要用于数据的传递,该类的方法主要访问私有的字段。例如在两个模块间传递多个信息可以将这些信息封装在一个JAVABEAN中这种类的对象通常称为值对象(Value Object简称VO)。在这个类中属性是通过是根据方法名推断出来的以为根本就看不到java类内部的成员变量。在推断的时候有这样的规律,去掉set或者get后得到的子串中,如果第二个字符是小写的那么就把第一个变成小写,那么这个子串就是该类中的一个属性:如,setId—>id,id就是一个属性名;setLastlast,last就是一个属性名;setCPU-CPU,CPU就是一个属性名(第二个字母大写则第一个不用在转换为小写了);
在视频中讲的主要是内省,老师说在直接用类的get方法来获得属性有难度。所以通过API提供的内省方式来获得比较容易。首先直接使用PropertyDescriptor类来获得一个类的某个名字的get和set属性方法。如果在构造该类的时候传了要获得的属性的名字那么这个类就是把该属性的get和set方法。
Class Person{
private int x;
public int y;
public Person(int x){this.x = x;}
public int setX(int x){this.x = x;}
public void getX() return this.x;
}
用上面的话来理解就是在PropertyDescriptor m = PropertyDescriptor(“x”,Person.class);这个m中封装的就是getX和setX方法。然后再通过PropertyDescriptor类中获得属性的方法和获的写入属性的方法来进行属性值的得到和属性值的修改。
属性值的获得:
Method m1 = m.getReadMethod();
m1.invoke(new Person(3));
属性值的修改:
Method m2 = m.getWriteMethod();
m2.invoke(new Person(3),1);
在就是老师讲了一个比较复杂的方法通过Introspector的一个静态方法来获得BeanInfo类型的对象,然后再通过该对象的getPorpertyDescriptor()方法来获得这个对象中封装的所有的含有get和set方法的属性。
Person p = new Person(3);
BeanInfo bi = Introspector.getBeanInfo(p.getClass());
PropertyDescriptor[] pd = bi.getPropertyDescriptors();
for(PropertyDescriptor pd1 : pd){
System.out.println(pd1.getName());
}
打印的结果是class,x;
当然这样的话,就简单多了,因为现在已经把知道了属性x对应的get和set方法在pd数组中存着,那么就可通过比较来确定最后的是set还是get方法并进行操作。