java内省
1、什么是内省?
内省(Introspector)是Java语言对Javabean类属性、方法的一种缺省处理方法。
JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。将这些信息储存在类的私有变量中,通过set()、get()获得。如:
public class Person {
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;
}
}
在Person类中有属性name,那我们可以通过getName(),setName()来得到其值或设置新的值。通过getName(),setName()来访问name属性,这就是默认的规则。Java JDK中提供了一套API用来访问某个属性的getter/setter方法,这就是内省。
JDK内省类库:
PropertyDescriptor类:该类表示JavaBean类通过存储器导出一个属性。主要方法:(1)getName()获取属性名,(2)getPropertyType()获取属性的Class对象,(3)getReadMethod()获得用于读取属性值的方法;getWriteMethod()获得用于写入属性值的方法。
Introspector类: 将JavaBean中的属性封装起来进行操作。在程序中把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo(class)方法,得到的BeanInfo对象封装了把这个类当做JavaBean来看的结果信息,即属性的信息。getPropertyDescriptors(),获得属性的描述,放在PropertyDescriptor[]数组中,来查找、设置类的属性。
2、内省怎么用?
1)操作一个属性
如只操作Person类中的age属性:
PropertyDescriptor pro = new PropertyDescriptor("age", Person.class);
Person person = new Person();
Method method = pro.getWriteMethod();
method.invoke(person, 12);
System.out.println(pro.getReadMethod().invoke(person));
2)操作多个属性
PropertyDescriptor[] pro = Introspector.getBeanInfo(Person.class).getPropertyDescriptors();
Person p = new Person();
System.out.print("Person的属性有:");
for (PropertyDescriptor pr : pro) {
System.out.print(pr.getName() + " ");
}
System.out.println("");
for (PropertyDescriptor pr : pro) {
// 获取bean的set方法
Method writeme = pr.getWriteMethod();
if (pr.getName().equals("name")) {
// 执行方法
writeme.invoke(p, "xiong");
}
if (pr.getName().equals("age")) {
writeme.invoke(p, 23);
}
// 获取bean的get方法
Method method = pr.getReadMethod();
System.out.print(method.invoke(p) + " ");
}
或
Class<?> cl = Class.forName("com.ushareit.springMaven.Person");
BeanInfo beaninfo = Introspector.getBeanInfo(cl, Object.class);
PropertyDescriptor[] pro = beaninfo.getPropertyDescriptors();
Person p = new Person();
System.out.print("Person的属性有:");
for (PropertyDescriptor pr : pro) {
System.out.print(pr.getName() + " ");
}
System.out.println("");
for (PropertyDescriptor pr : pro) {
// 获取bean的set方法
Method writeme = pr.getWriteMethod();
if (pr.getName().equals("name")) {
// 执行方法
writeme.invoke(p, "xiong");
}
if (pr.getName().equals("age")) {
writeme.invoke(p, 23);
}
// 获取bean的get方法
Method method = pr.getReadMethod();
System.out.print(method.invoke(p) + " ");
}