1.Introspector
内省/自省:其实主要就是获取和操作JavaBean中的属性.
操作JavaBean的属性:1):获取属性相关信息.属性名,属性类型
2):给属性设置数据,调用setter方法.
3):获取属性的数据,调用getter方法.
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class IntrospectorDemo {
public static void main(String[] args) throws Exception {
//获取某一份字节码的JavaBean 对象 ,这里是获取User的JavaBean对象,
//这种方式得到的javaBean对象中会包含父类Object的属性和方法
//BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
//我们使用下面这种,可以去掉父类的,只需要得到自己本类的属性和方法
BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class);
//获取javaBean对象中的所有属性的描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
//获取属性名称
String name = pd.getName();
System.out.println(name);
//获取属性所属类型
//获取属性的操作方法
Method readMethod = pd.getReadMethod();//获取get方法
Method writeMethod = pd.getWriteMethod();//获取set方法
System.out.println("getter:"+readMethod);
System.out.println("setter:"+writeMethod);
System.out.println("================================");
}
}
}
2.JavaBean和 Map相互转换
Map是由key-value组成,key是不能重复的.JavaBean是由属性名和属性值组成,属性名是不同的.
如果把JavaBean的属性名看做是Map的key,把属性值看做是Map的value,那么一个Map对象和一个JavaBean是等级的.
------------------------------------------------------------------------------
把JavaBean转换为Map对象.
public static Map<String,Object> bean2map(Object bean){}
把Map对象转换为JavaBean.
public static Object map2bean(Map<String,Object> beanMap,Class beanType){}
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.Map;
public class MyBeanUtils {
/**
* 把javaBean转换成Map对象
* @param bean javaBean对象
* @return Map集合对象
* @throws Exception
*/
public static Map<String, Object> bean2Map(Object bean) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(),
Object.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
//获取属性名
String pName = pd.getName();
//获取属性值
Object pValue = pd.getReadMethod().invoke(bean);//获取get方法,然后再调用获取值
//设置到map中去
map.put(pName, pValue);
}
return map;
}
/**
* 把Map集合装换成javaBean对象
* @param map Map集合对象
* @param beanType 需要转换成为的javaBean的字节码对象
* @return 转换后的javaBean对象
* @throws Exception
*/
public static <T> T map2Bean(Map<String, Object> map, Class<T> beanType)
throws Exception {
T obj = beanType.newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(beanType, Object.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
String pName = pd.getName();
Object pValue = map.get(pName);
pd.getWriteMethod().invoke(obj, pValue);//获得setter方法然后调用设置值
}
return obj;
}
//测试
public static void main(String[] args) throws Exception {
User user = new User();
user.setId(1L);
user.setAge(18);
user.setName("杨哥");
// 把javaBean转换成Map对象
Map<String, Object> map = bean2Map(user);
System.out.println(map);
//把Map集合装换成javaBean对象
User user2 = map2Bean(map, User.class);
System.out.println(user2);
}
}