当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
java内省机制
发布时间:2010/8/30 15:44:42 来源:城市学习网 编辑:ziteng
  内省是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。
  例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。
  Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包 java.beans 中。
  一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。
  内省测试类:Introspector.java
  Java代码
  package com.royzhou.bean;
  import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.MethodDescriptor; import java.beans.PropertyDescriptor;
  public class IntrospectorTest {
  public static void main(String[] args) throws Exception {
  SimpleBean sb = new SimpleBean("royzhou",new String[]{"football","backetball"});
  System.out.println(sb);
  /**
  * 使用Introspector.getBeanInfo(SimpleBean.class)将Bean的属性放入到BeanInfo中。
  * 第二个参数为截止参数,表示截止到此类之前,不包括此类。
  * 如果不设置的话,那么将会得到本类以及其所有父类的info。
  * BeanInfo中包含了SimpleBean的信息
  */
  BeanInfo beanInfo = Introspector.getBeanInfo(sb.getClass());
  //将每个属性的信息封装到一个PropertyDescriptor形成一个数组其中包括属性名字,读写方法,属性的类型等等PropertyDescriptor[] propertys = beanInfo.getPropertyDescriptors();
  for(PropertyDescriptor property : propertys) {
  System.out.println("属性名:" + property.getName()); System.out.println("类型:" + property.getPropertyType());
  }
  System.out.println();
  System.out.println("列出SimpleBean的所有方法"); MethodDescriptor[] methods = beanInfo.getMethodDescriptors();
  for(MethodDescriptor method : methods) {
  System.out.println(method.getName());
  }
  System.out.println();
  /**
  *重新设置属性值
  */
  for(PropertyDescriptor property : propertys) {
  if(property.getPropertyType().isArray()){  //getPropertyType得到属性类型。
  if(property.getPropertyType().isArray()) { if("hobby".equals(property.getName())) {
  //getComponentType()可以得到数组类型的元素类型
  if(property.getPropertyType().getComponentType().equals(String.class)) {
  //getWriteMethod()得到此属性的set方法----Method对象,然后用invoke调用这个方法
  property.getWriteMethod().invoke(sb, new Object[]{new String[]{"tennis","fishing"}});
  }
  }
  }
  } else if("name".equals(property.getName())) { property.getWriteMethod().invoke(sb, new Object[] { "royzhou1985" });
  }
  } [NextPage]   /**
  *获取对象的属性值
  */
  System.out.println("获取对象的属性值");
  for(PropertyDescriptor property : propertys) {
  if(property.getPropertyType().isArray()){  //getPropertyType得到属性类型。
  //getReadMethod()得到此属性的get方法----Method对象,然后用invoke调用这个方法String[] result=(String[]) property.getReadMethod().invoke(sb, new Object[]{}); System.out.print(property.getName()+":");//getName得到属性名字for (int j = 0; j < result.length; j++) { System.out.print(result[j] + ",");
  }
  System.out.println();
  }
  else{
  System.out.println(property.getName()+":"+property.getReadMethod().invoke(sb, new Object[]{}));
  }
  }
  }
  }
  package com.royzhou.bean;
  import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.MethodDescriptor; import java.beans.PropertyDescriptor;
  public class IntrospectorTest {
  public static void main(String[] args) throws Exception {
  SimpleBean sb = new SimpleBean("royzhou",new String[]{"football","backetball"});
  System.out.println(sb);
  /**
  * 使用Introspector.getBeanInfo(SimpleBean.class)将Bean的属性放入到BeanInfo中。
  * 第二个参数为截止参数,表示截止到此类之前,不包括此类。
  * 如果不设置的话,那么将会得到本类以及其所有父类的info。
  * BeanInfo中包含了SimpleBean的信息
  */
  BeanInfo beanInfo = Introspector.getBeanInfo(sb.getClass());
  //将每个属性的信息封装到一个PropertyDescriptor形成一个数组其中包括属性名字,读写方法,属性的类型等等PropertyDescriptor[] propertys = beanInfo.getPropertyDescriptors();
  for(PropertyDescriptor property : propertys) {
  System.out.println("属性名:" + property.getName()); System.out.println("类型:" + property.getPropertyType());
  }
  System.out.println();
  System.out.println("列出SimpleBean的所有方法"); MethodDescriptor[] methods = beanInfo.getMethodDescriptors();
  for(MethodDescriptor method : methods) {
  System.out.println(method.getName());
  }
  System.out.println();
  /**
  *重新设置属性值
  */
  for(PropertyDescriptor property : propertys) {
  if(property.getPropertyType().isArray()){  //getPropertyType得到属性类型。
  if(property.getPropertyType().isArray()) { if("hobby".equals(property.getName())) {
  //getComponentType()可以得到数组类型的元素类型
  if(property.getPropertyType().getComponentType().equals(String.class)) { //getWriteMethod()得到此属性的set方法----Method对象,然后用invoke调用这个方法property.getWriteMethod().invoke(sb, new Object[]{new String[]{"tennis","fishing"}});
  }
  }
  }
  } else if("name".equals(property.getName())) { property.getWriteMethod().invoke(sb, new Object[] { "royzhou1985" });
  }
  }
 [NextPage]   /**
  *获取对象的属性值
  */
  System.out.println("获取对象的属性值");
  for(PropertyDescriptor property : propertys) {
  if(property.getPropertyType().isArray()){  //getPropertyType得到属性类型。
  //getReadMethod()得到此属性的get方法----Method对象,然后用invoke调用这个方法String[] result=(String[]) property.getReadMethod().invoke(sb, new Object[]{}); System.out.print(property.getName()+":");//getName得到属性名字for (int j = 0; j < result.length; j++) { System.out.print(result[j] + ",");
  }
  System.out.println();
  }
  else{
  System.out.println(property.getName()+":"+property.getReadMethod().invoke(sb, new Object[]{}));
  }
  }
  }
  }
  输出结果:
  com.royzhou.bean.SimpleBean@757aef
  name:=royzhou
  hobby:football,backetball,
  属性名:class
  类型:class java.lang.Class
  属性名:hobby
  类型:class [Ljava.lang.String;
  属性名:name
  类型:class java.lang.String
  列出SimpleBean的所有方法
  hashCode
  setHobby
  equals
  wait
  wait
  notify
  getClass
  toString
  notifyAll
  getHobby
  setName
  wait
  getName
  获取对象的属性值
  class:class com.royzhou.bean.SimpleBean hobby:tennis,fishing,
  name:royzhou1985
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved