【类反射】(模拟Java内省的功能)

本文介绍了一种使用Java反射机制的方法,能够将Map中的数据映射到一个具备getter和setter方法的Model类对象中,实现对象的自动填充。

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

★ 准备工作

定义一个Model类,里面所有的属性都是private的,然后为每个属性提供getter和setter方法;

再准备一个Map,map的key值都是类里面的属性字段的字符串表示,值任意。

★ 真正的工作

设计一个方法Object getModel(Map map,Class cls),传入一个包含所有值的Map,然后再传入Model类的class,那么返回Model类的实例,这个实例里面已经包含好了所有相关的数据。也就是把Map中的数据通过反射,设置回到Model类实例中。

BeanUtils类:

package cn.hncu.reflect.test.beanUtil;

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

import org.junit.Test;

/**
 * 
(模拟Java内省的功能)
★ 准备工作 
    (1)定义一个Model类,里面所有的属性都是private的,然后为每个属性提供getter和setter方法;
    (2)再准备一个Map,map的key值都是类里面的属性字段的字符串表示,值任意。 

★ 真正的工作 
    (3)设计一个方法Object getModel(Class cls,Map map)。
    (4)传入一个包含所有值的Map,然后再传入Model类的class。
    (5)那么返回Model类的实例。这个实例里面已经包含好了所有相关的数据。
    (6)也就是把Map中的数据通过反射,设置回到Model类实例中。 


 */
public class BeanUtils {

    //(1)定义一个Model类
    //(2)构造hashmap
    //(3)构造一个Object getModel(Class cls,Map map)。
    @Test
    public  static <T> T getModel(Class<T> cls,HashMap<String , Object> map) throws Exception{
        T obj=cls.newInstance();
        //1)得到Class的对象----遍历其中所有的字段,由map中的key获得其value,将此value设置到cls对象中。
        Field[] flds=cls.getDeclaredFields();
        for(Field fld:flds){
            System.out.println(fld.getName());
            Object data=map.get(fld.getName());
            if(data==null){
                System.out.println(fld.getName()+"数据不存在!");
            }else{
                //2)生成方法名----通过构造好的方法名调用此方法设置此model中的字段值
                String methodName="set"+fld.getName().substring(0, 1).toUpperCase()+fld.getName().substring(1);
                //3)找到对象方法名的method方法
                Method m=cls.getDeclaredMethod(methodName, fld.getType());
                //4)执行该method方法----invoke
                m.invoke(obj, data);
            }
        }
        return obj;
    }
}

Client类(用户测试):

package cn.hncu.reflect.test.beanUtil;

import java.util.HashMap;

public class Client {
    public static void main(String[] args) {
        HashMap<String , Object> map=new HashMap<String, Object>();
        map.put("uuid", "00001");
        map.put("name", "Tom");
        map.put("type", 2);
        map.put("pwd", "1234");

        try {
            UserModel user=(UserModel) BeanUtils.getModel(UserModel.class, map);
            System.out.println(user.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

UserModel类:

package cn.hncu.reflect.test.beanUtil;

import java.io.Serializable;

public class UserModel implements Serializable{

    private String uuid;//用户id
    private String name;//用户名
    private int type;//用户类型
    private String pwd;


    public UserModel() {
        super();
    }
    public UserModel(String uuid, String name, int type, String pwd) {
        super();
        this.uuid = uuid;
        this.name = name;
        this.type = type;
        this.pwd = pwd;
    }
    public String getUuid() {
        return uuid;
    }
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((pwd == null) ? 0 : pwd.hashCode());
        result = prime * result + type;
        result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        UserModel other = (UserModel) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (pwd == null) {
            if (other.pwd != null)
                return false;
        } else if (!pwd.equals(other.pwd))
            return false;
        if (type != other.type)
            return false;
        if (uuid == null) {
            if (other.uuid != null)
                return false;
        } else if (!uuid.equals(other.uuid))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "UserModel [uuid=" + uuid + ", name=" + name + ", type=" + type
                + ", pwd=" + pwd + "]";
    }



}

运行结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值