内省
内省是与反射类似的技术,它是以规范化的Java bean为模板,将类中的成员变量和getter、setter方法关联起来
它的一般用法是:
使用Java反射解析Java类的结构,把字段和该字段对应的setter、getter方法关联起来,封装到PropertyDescriptor(属性描述器)中。通过属性描述器可以直接获得该字段的setter、getter方法的Method对象,进而根据实际需要进行操作。
关于内省中常用类或方法的介绍与常见使用:
- BeanInfo
Use the BeanInfo interface to create a BeanInfo class and provide explicit information about the methods, properties, events, and other features of your beans.
使用BeanInfo接口创建一个BeanInfo类,并提供关于bean的方法、属性、事件和其他特性的明确信息。
- Introspector
The Introspector class provides a standard way for tools to learn about the properties, events, and methods supported by a target Java Bean.
内省类为工具提供了一种标准的方法来了解目标Java Bean所支持的属性、事件和方法。
- PropertyDescriptor
PropertyDescriptor描述了通过一对访问器方法导出的Java Bean的一个属性。
常用方法:
getPropertyType():获取属性的数据类型
getReadMethod():获取属性的get方法
getWriteMethod() :获取属性的set方法
- MethodDescriptor
常用方法:
getMethod():获取方法描述器中的方法
以下是代码:
java">public class User implements Serializable {
private static final long serialVersionUID = -3015143840907090098L;
private String name;
private String age;
public User(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
Class clazz=User.class;
Object obj=clazz.newInstance();
BeanInfo bean = Introspector.getBeanInfo(clazz);
PropertyDescriptor[] descriptors =bean .getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : descriptors) {
//我是试验时 这里输出属性名 多了class 应该是来自于Object
//而serialVersionUID则没有输出 这跟getDeclaredFields()有些区别
System.out.println(propertyDescriptor.getName());
//获得属性的set方法,并给出参数调用
Method writeMethod = propertyDescriptor.getWriteMethod();
writeMethod.invoke(obj, args);
//获得属性的get方法,并调用
Method readMethod = propertyDescriptor.getReadMethod();
readMethod.invoke(obj);
}
MethodDescriptor[] methods = bean.getMethodDescriptors();
for (MethodDescriptor methodDescriptor : methods ) {
//获得了Method对象 就跟反射中的操作类似了
Method method=methodDescriptor.getMethod();
}
以上若有解释不当或错误,请指出,谢谢!