知识大全 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

相关参考

知识大全 Java核心 Java中多态的实现机制

Java核心Java中多态的实现机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  多态性是面向

知识大全 Java绘图机制

Java绘图机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JAVA的绘图功能非常丰富绘图包

知识大全 Java反射机制深入研究

Java反射机制深入研究  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java反射是Java语

知识大全 Java垃圾回收机制

Java垃圾回收机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  java垃圾回收主要是靠一个

知识大全 JAVA 的Socket机制

JAVA的Socket机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Socket机制用到的

知识大全 Java多线程处理机制

Java多线程处理机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一线程的同步  Java应

知识大全 Java移位运算机制

Java移位运算机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  举例代码  publiccl

知识大全 Java的文件IO机制

Java的文件IO机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java有一个庞大的I/O

知识大全 实现JAVA的动态类载入机制

实现JAVA的动态类载入机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作为充分利用Java

知识大全 Java堆栈溢出的机制与原理

Java堆栈溢出的机制与原理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java堆栈溢出的出