zoukankan      html  css  js  c++  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" });

        }

        }

  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/shenliang123/p/2226918.html
Copyright © 2011-2022 走看看