反射

時間匆匆,一晃就到了十一月份了,忙裏偷閒的來到了這裏!

接下來和大家分享一些關於反射的小知識。


1、創建一個實體類Cat

package cn.java.reflect;

public class Cat {
	private String name;
	
	private Integer age;
	
	private float weight;
	
	public Cat() {
		super();
	}

	public Cat(String name, Integer age, float weight) {
		super();
		this.name = name;
		this.age = age;
		this.weight = weight;
	}
	
	@Override
	public String toString() {
		return "Cat [name=" + name + ", age=" + age + ", weight=" + weight + "]";
	}
	

}

2、工具類MapAndBeanUtils

package cn.java.reflect;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class MapAndBeanUtils {
	
	/**
	 * 傳遞任意一個bean對象,將此對象中的全部屬性封裝到map中
	 * @throws Exception 
	 */
	@SuppressWarnings("rawtypes")
	public static Map<String,Object> beanToMap(Object bean) throws Exception{
		if(bean == null){
			return null;
		}
		Map<String,Object> resultMap = new HashMap<String,Object>();
		//1、獲取bean字節碼文件
		Class beanClass = bean.getClass();
		//2、通過字節碼文件獲取bean中所有字段
		Field[] fields = beanClass.getDeclaredFields();
		//3、分別取出字段的字段名和字段值(字段名作爲key,字段值作爲value)
		for (Field field : fields) {
			field.setAccessible(true);//如果某一屬性被private修飾,需要通過暴力反射來獲取
			String fieldName = field.getName();//bean中的某一屬性名
			Object fieldValue = field.get(bean);//bean中的某一屬性值
			resultMap.put(fieldName, fieldValue);
		}
		return resultMap;
	}
	
	/**
	 * 傳遞一個沒有屬性值的bean對象,傳遞一個有數據的map,將map中的數據保存到bean中
	 * @throws Exception 
	 */
	@SuppressWarnings("rawtypes")
	public static Object mapToBean(Map<String,Object> map,Object bean) throws Exception{
		try {
			if(map == null || bean == null){
				return null;
			}
			//1、獲取bean對象的字節碼文件
			Class beanClass = bean.getClass();
			for (Map.Entry<String, Object> entry : map.entrySet()) {
				//2、獲取key=value的數據記錄
				String key = entry.getKey();
				Object value = entry.getValue();
				//3、通過字節碼、key獲取相應的Field對象
				Field field = beanClass.getDeclaredField(key);
				field.setAccessible(true);
				//4、將value值保存到bean對象的屬性中
				field.set(bean, value);
				
			}
		} catch (NoSuchFieldException e) {
			System.out.println("map中的key與實體類中的屬性名不匹配!");
		}
		return bean;
	}

}

3、測試類reflectTest

package cn.java.reflect;

import java.util.HashMap;
import java.util.Map;

public class reflectTest {

	public static void main(String[] args) throws Exception {
		//測試bean轉map
		Cat cat = new Cat("tom",20,10);
		Map<String, Object> map = MapAndBeanUtils.beanToMap(cat);
		System.out.println(map);
		
		//測試map轉bean
		Cat cat1 = new Cat();
		Map<String,Object> hm = new HashMap<String,Object>();
		hm.put("name", "tom");
		hm.put("age", 30);
		hm.put("weight", 20.5F);
		MapAndBeanUtils.mapToBean(hm, cat1);
		System.out.println(cat1);
	}

}

歡迎大家留言,一起學習吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章