• Java内省


    内省(Introspector)是Java语言对Bean类属性、事件的一种缺省处理方法。本质就是反射.

    一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器 (PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来 调用这些方法。

    核心类:

           PropertyDescriptor - 属性描述器

    API:

           PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。

           以下javaBean拥有get and set就是一对,就可以通过PropertyDescorptor来操作。

    JavaBean的定义

                  拥有无参数构造。

                  拥有一个get | set | isXxxx方法。

    如果希望被内省使用必须:1、  拥有元参数构造    2、   拥有一对get  && setXxx | isXxxx方法

     1 //1、反射
     2         User u=new User();
     3         Method m= u.getClass().getMethod("setId", String.class);
     4         m.invoke(u, "12345");
     5         System.err.println("》》反射"+u);
     6         
     7         System.err.println("============================");
     8         
     9         //2、内省
    10         //注意:这里默认后面两个参数可以省略,前提是get和set方法符合规则getId和setId,否则就要在后面添加两个参数,是get和set的函数名。
    11         PropertyDescriptor pd=new PropertyDescriptor("id", u.getClass());
    12         /**
    13          * pd.getWriteMethod()=setXxx
    14          * pd.getReadMethod()=getXxx
    15          */
    16         m= pd.getWriteMethod();        
    17         m.invoke(u, "1234567890-");
    18         pd=new PropertyDescriptor("age", u.getClass());
    19         m=pd.getWriteMethod();
    20         m.invoke(u, 90);
    21         System.err.println("内省》》"+u);
    22         System.err.println("========================");
    23     //3、BeanInfo专门用于分析一个Bean拥有多少属性
    24         BeanInfo bi=Introspector.getBeanInfo(u.getClass());
    25         PropertyDescriptor [] pds=bi.getPropertyDescriptors();
    26         for(PropertyDescriptor p:pds)
    27         {
    28             String name=p.getName();
    29             System.err.println(name);
    30         }
    31         System.err.println("*******************************");
    32     //4、遍历方法
    33         User user=new User();
    34         Method[] ms=user.getClass().getDeclaredMethods();
    35         for(Method me:ms)
    36         {
    37             String name=me.getName();
    38             System.err.println(name);
    39             if(name.startsWith("set"))
    40             {
    41                 Class<?>[] c=me.getParameterTypes();
    42                 System.err.println(c[0]);
    43                 if(c[0].equals(String.class))
    44                 {
    45                     me.invoke(user, "Jack");
    46                 }
    47                 else if (c[0].equals(Integer.class)) {
    48                     me.invoke(user, 30);
    49                 }
    50                 
    51             }
    52         }
    53         System.err.println(user);
    54     }

     

  • 相关阅读:
    近期学习情况
    java连接数据库的两种方法总结
    近两个星期学习成果
    云笔记第一阶段总结
    圆面积
    C++计算器项目的初始部分
    C++视频课程
    A+B Format
    大一下学期的自我目标
    Kohana的请求流
  • 原文地址:https://www.cnblogs.com/liuwt365/p/4162550.html
Copyright © 2020-2023  润新知