Java内省
内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。说简单一点就是操作JavaBean的一套API。
什么是JavaBean?
javaBean只是一种规范,大家都按照约定好的一套规则写java类,既然是规范就有一定的要求:  
- 类是public的,然后有个无参的构造函数
- 属性是private的,通过设置setXXX()和getXXX()来访问
- 能支持事件,例如 addXXXXListener(XXXEvent e), 事件可以是 Click 事件,Keyboard 事件等等
- 提供应该 反射机制,这样可以查看java bean的各种信息
- 可以序列化,可以保存在硬盘上
 例如:1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22public class User { 
 private String name;
 private String address;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getAddress() {
 return address;
 }
 public void setAddress(String address) {
 this.address = address;
 }
 }
JDK内省类库
PropertyDescriptor类:
PropertyDescriptor可以获取某一个具体的属性。主要的方法有:
- getPropertyType(),获得属性的Class对象;
- getReadMethod(),获得用于读取属性值的方法,例如getXXX()方法;
- getWriteMethod(),获得用于写入属性值的方法,例如setXXX()方法;
- hashCode(),获取对象的哈希值;
- setReadMethod(Method readMethod),设置用于读取属性值的方法;
- setWriteMethod(Method writeMethod),设置用于写入属性值的方法。
 示例代码:输入结果:1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14public class JavaBeanUtils { 
 public static void main(String[] args) throws IntrospectionException {
 User user = new User();
 PropertyDescriptor propertyDescriptor = new PropertyDescriptor("name",user.getClass());
 System.out.println(propertyDescriptor.getPropertyType());
 Method method = propertyDescriptor.getReadMethod();
 System.out.println(method.getName());
 method = propertyDescriptor.getWriteMethod();
 System.out.println(method.getName());
 }
 }1 
 2
 3class java.lang.String 
 getName
 setNameIntrospector类:Introspector可以按照JavaBean的规范将一个类封装成BeanInfo对象。通过调用getPropertyDescriptors()方法会返回一个包含所有属性的PropertyDescriptor对象数组,通过PropertyDescriptor可以操作类的属性。
 具体代码如下:1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14public class JavaBeanUtils { 
 public static void main(String[] args) throws IntrospectionException {
 BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
 PropertyDescriptor[] pd = beanInfo.getPropertyDescriptors();
 //迭代每一个描述器
 for (PropertyDescriptor propertyDescriptor : pd) {
 System.out.println("属性名 :"+propertyDescriptor.getName());
 System.out.println("setter :"+propertyDescriptor.getWriteMethod());
 System.out.println("getter :"+propertyDescriptor.getReadMethod());
 }
 }
 }
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mr_Yao的驿站!
 评论



