java内省机制

来源:java认证发布时间:2012-11-12 13:12:21java认证视频

    编辑特别推荐:

    java反射机制

    Java对象序列化小结

    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的信息

    */

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

    }

    }

上一页123下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答