内省是sun公司开发的一套API,专门用于操作java对象的属性,行对于反射技术就简单的多了。
内省访问JavaBean属性的两种方式:
1、通过PropertyDescriptor类操作Bean的属性
2、通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器,通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后通过反射几只来调用这些方法。
java的属性:
private String name 这是字段。
private String job; 这是属性
public String getJob(){
return job;
}
java属性的读写方法:
public String getXxx(){ 读的方法
return "xxx";
}
public void setXxx(){ 写的方法
}
例子:
Student.java类
- public class Student {
- private String name;
- private int age;
- 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;
- }
Introspector.java 处理类
- import java.beans.*;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.Method;
- import org.junit.Test;
- public class Intro {
- @Test
- public void test() throws Exception {
- Student stu = new Student();
- // 1、通过Introspector类获得Bean对象的 BeanInfo,
- BeanInfo entity = Introspector.getBeanInfo(Student.class);
- // 2、然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor )
- PropertyDescriptor pdrs[] = entity.getPropertyDescriptors();
- // 3、通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,
- for (PropertyDescriptor pd : pdrs) {
- System.out.println(pd.getName()); 获取此特性的编程名称 class(来自与java.lang.Object) name age
- System.out.println(pd.getPropertyType()); 获取其类型 java.lang.String java.lang.String int
- if (pd.getName().equals("age")) {
- Method md = pd.getWriteMethod();
- md.invoke(st, 12);
- }
- }
- System.out.println(stu.getAge());// 12
- }
- @Test
- public void test1()throws Exception{
- Student stu = new Student();
- //通过构造器 创建 PropertyDescriptor对象
- PropertyDescriptor pd = new PropertyDescriptor("age", Student.class);
- Method md = pd.getWriteMethod(); //写操作
- md.invoke(st, 120);
- System.out.println(stu.getAge());//120
- md = pd.getReadMethod();
- int value = (Integer)md.invoke(stu, null); //读操作
- System.out.println(value);//120
- }
- }