【类反射】(模拟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
- 类反射 模拟Java内省的功能
- 【类反射】(模拟Java内省的功能)
- 练习(模拟Java内省的功能)
- 模拟Java内省的功能
- 利用类反射模拟内省功能
- 模拟java内省的功能,做自己的BeanUtils
- java的内省和反射
- java的内省与反射
- java的反射和内省
- java的内省与反射
- Java反射的应用 --- 内省
- 类的内省及反射
- 浅谈Java的反射(四) 内省的使用
- 【转】JAVA的内省(introspector)与反射(reflection)
- JAVA的内省(introspector)与反射(reflection)
- JAVA的内省(introspector)与反射(reflection)
- JAVA 的内省(introspector)与反射(reflection)
- JAVA 的内省(introspector)与反射(reflection)
- SSH框架详解
- Javascript函数的简单学习
- 构造方法定义
- linux基础命令
- Spring提供的后容器处理器
- 【类反射】(模拟Java内省的功能)
- 初探nginx架构(100%)
- Struts2常量的具体用法实例
- Bean注入方式
- ubuntu/deepin 下下载wxpython
- 单元测试SpringMVC带文件上传的controller
- 2017陕西省网络空间安全技术大赛_Crypto_crypt1_Writeup
- Javascript中String对象的的简单学习
- hbase性能调试