知识大全 java内省机制

Posted 属性

篇首语:能够说服别人最好的方式,其实就是你始终坚持在做的事。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java内省机制相关的知识,希望对你有一定的参考价值。

  内省是 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 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[] royzhou );

  

  

  /**

  *获取对象的属性值

  */

  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 = ; 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 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[] royzhou );

  

  

  /**

  *获取对象的属性值

  */

  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 = ; j < result length; j++) System out print(result[j] + );

  

  System out println();

  

  else

  System out println(property getName()+ : +property getReadMethod() invoke(sb new Object[]));

  

  

  

  

  输出结果:

   royzhou bean SimpleBean@ aef

  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 royzhou bean SimpleBean hobby:tennis fishing

cha138/Article/program/Java/hx/201311/26908

相关参考