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

来源:互联网 发布:手机文字编辑软件 编辑:程序博客网 时间:2024/06/08 04:41

★ 准备工作

定义一个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 + "]";    }}

运行结果:

这里写图片描述

0 0