关于JavaBean:符合特定规则的类(JavaBean只是一个规范而已!)
(1)私有的字段(private Field)
(2)对私有字段提供存取方法(getter/setter)
(3)数量任意的业务方法
内省(IntroSpector)是java对Bean类属性、事件的一种缺省处理方法。即通过getter/setter来访问属性。Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中,一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。
访问JavaBean属性的两种方式:
1)直接调用bean的getter/setter方法
2)通过内省技术访问(java.beans包中)
Student类
package web.java.introspector;
public class Student {
private String name;
private String sno;
public String getName() {
return name;
}
public String getSno() {
return sno;
}
public void setName(String name) {
this.name = name;
}
public void setSno(String sno) {
this.sno = sno;
}
/*
* 属性和字段是不同的:
* 字段是在类最上面声明的变量或常量部分
* 属性是getXxx/setXxx后面的Xxx
* 显然这里的age也是属性
*/
public int getAge() {
return 21;
}
}
测试类:(这里使用Junit进行测试)
package web.java.introspector;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import org.junit.Test;
public class Demo1 {
@Test
public void test1() throws Exception {
Student s1 = new Student();
/*
* 1. 通过PropertyDescriptor类操作Bean的属性
*/
PropertyDescriptor pd = new PropertyDescriptor("name", Student.class);
Method m = pd.getWriteMethod();
m.invoke(s1, "well");
m = pd.getReadMethod();
String returnValue = (String)m.invoke(s1, null);
System.out.println(returnValue);
}
/*
* 通过Introspector类获得Bean对象的 BeanInfo,
* 然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),
* 通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,
* 然后通过反射机制来调用这些方法。
*/
@Test
public void test2() throws Exception {
//BeanInfo表示该Student对象所有的属性情况
BeanInfo bi = Introspector.getBeanInfo(Student.class);
//取得Student对象所有属性集合
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
System.out.println(pd.getName());//输出age class name sno
}
}
}
值得注意的是:任何一个JavaBean都有一个class属性,来自于Object类。