内省Introspector(反射操作javaBean)

时间:2022-03-23 19:05:21

一:内省是一种特殊的反射,来更方便的操作javaBean对象,通过内省可以获取到类字节码的描述器,

然后解剖每一个字段,获取每个字段的读写方法,即get/set方法的反射,然后获取或者是封装bean的value

下面是通过内省向Bean中set值得示例:

public static <T> T toBean(T t){
		Class<?> clazz = t.getClass();
		try {
			//根据Class对象获取该类的BeanInfo信息
			BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
			//根据BeanInfo获取该类中每一个字段的描述器
			PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
			//遍历描述器,获取每个字段的名称以及写方法(set方法),然后将value值set入bean中
			for(PropertyDescriptor property:props){
				String field = property.getName();
				if(EXCLUDE_FIELD.equals(field)){
					continue;
				}
				Method method = property.getWriteMethod();
				method.invoke(t,getCode(field));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return t;
	}

 

整个测试案例如下:

 1 /**
 2  * 
 3  */
 4 package com.hlcui.test;
 5 
 6 import java.beans.BeanInfo;
 7 import java.beans.Introspector;
 8 import java.beans.PropertyDescriptor;
 9 import java.lang.reflect.Method;
10 import java.util.HashMap;
11 import java.util.Map;
12 
13 import com.hlcui.entity.Person;
14 
15 /**
16  * @author Administrator
17  *
18  */
19 public class TestCase {
20     
21     public static Map<String,Object> codeMap = new HashMap<String,Object>();
22     
23     private static final String EXCLUDE_FIELD = "class";
24     
25     //静态代码块加载静态资源
26     static{
27         codeMap.put("id",1);
28         codeMap.put("name", "jack");
29         codeMap.put("salary",14000);
30     }
31     
32     public static void main(String[] args){
33         Person person = toBean(new Person());
34         System.out.println(person);
35     }
36     
37     public static <T> T toBean(T t){
38         Class<?> clazz = t.getClass();
39         try {
40             //根据Class对象获取该类的BeanInfo信息
41             BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
42             //根据BeanInfo获取该类中每一个字段的描述器
43             PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
44             //遍历描述器,获取每个字段的名称以及写方法(set方法),然后将value值set入bean中
45             for(PropertyDescriptor property:props){
46                 String field = property.getName();
47                 if(EXCLUDE_FIELD.equals(field)){
48                     continue;
49                 }
50                 Method method = property.getWriteMethod();
51                 method.invoke(t,getCode(field));
52             }
53         } catch (Exception e) {
54             e.printStackTrace();
55         }
56         return t;
57     }
58     
59     public static Object getCode(String field){
60         return codeMap.get(field);
61     }
62 }