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     }

 

原文地址:https://www.cnblogs.com/liuwt365/p/4162550.html