反射

本文将探讨Java反射机制,包括创建实体类Cat,使用MapAndBeanUtils工具类,以及在reflectTest测试类中的应用。通过实例,我们一起学习如何利用反射进行动态操作类和对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间匆匆,一晃就到了十一月份了,忙里偷闲的来到了这里!

接下来和大家分享一些关于反射的小知识。


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);
	}

}

欢迎大家留言,一起学习吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值