Java内省的学习

来源:互联网 发布:开淘宝店做代理好不好 编辑:程序博客网 时间:2024/06/05 18:16

内省

内省是与反射类似的技术,它是以规范化的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():获取方法描述器中的方法

以下是代码:

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();}

以上若有解释不当或错误,请指出,谢谢!

原创粉丝点击