设为首页 加入收藏

TOP

计算机二级辅导:java内省机制
2014-11-23 22:12:35 】 浏览:442
Tags:计算机 二级 辅导 :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 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的信息考试大-全国最大教育类网站(www.Examda。com)


  */


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


  }


  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇计算机二级辅导:java反射机制 下一篇计算机二级辅导:Java实现验证码

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目