Java之------类反射系列(三)
2016-05-07 00:44
531 查看
练习(模拟Java内省的功能)
★ 准备工作
定义一个Model类,里面所有的属性都是private的,然后为每个属性提供getter和setter方法;
再准备一个Map,map的key值都是类里面的属性字段的字符串表示,值任意。
★ 真正的工作
设计一个方法Object getModel(Map map,Class cls),传入一个包含所有值的Map,然后再传入Model类的class,那么返回Model类的实例,这个实例里面已经包含好了所有相关的数据。也就是把Map中的数据通过反射,设置回到Model类实例中。
(其实这个练习实质上就是在模仿BeanUtils的功能)
代码:
Model类:
模拟用户类:
★ 准备工作
定义一个Model类,里面所有的属性都是private的,然后为每个属性提供getter和setter方法;
再准备一个Map,map的key值都是类里面的属性字段的字符串表示,值任意。
★ 真正的工作
设计一个方法Object getModel(Map map,Class cls),传入一个包含所有值的Map,然后再传入Model类的class,那么返回Model类的实例,这个实例里面已经包含好了所有相关的数据。也就是把Map中的数据通过反射,设置回到Model类实例中。
(其实这个练习实质上就是在模仿BeanUtils的功能)
代码:
Model类:
package cn.hncu.reflect.myBeanUtils; public class UserModel { private String uuid; private String name; private int age; 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 getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int hashCode() { final int prime = 31; int result = 1; 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 (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 + ", age=" + age + "]"; } }MyBeanUtils:
package cn.hncu.reflect.myBeanUtil; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; public class MyBeanUtil { public static Object populate(Class cls,Map<span style="font-family: Arial, Helvetica, sans-serif;"><String, Object></span><span style="font-family: Arial, Helvetica, sans-serif;"> map) throws Exception{</span> Object obj=null; // public static <T>T populate(Class<T> cls,Map<String, Object> map) throws Exception{//可以使用这种加入泛型的方法,效果与上面是一样的 // T obj=null;//使用泛型的话就要将上面的Object obj=null;改成这个 //1 用类反射new出对象 obj=cls.newInstance(); //2 再用类反射对新new的对象设置属性值(必须遵守Java设置规范)--即通过setter方法设置 //2.1遍历出所有该类声明的属性 Field fields[]=cls.getDeclaredFields(); for (Field fld:fields){ //获取该fld对象所代表的属性名 String fldName=fld.getName(); //根据属性名,到map中去读取数据,只有数据非空才需要给该属性设置值 Object v=map.get(fldName); if (v==null){//如果map中不存在对应的属性数据,我们在这里给出提示信息 System.out.println(fldName+"的数据为空"); } else{ //如果map中存在对应的属性数据,则由属性名得出它的setter方法的名字 String methodName="set"+fldName.substring(0, 1).toUpperCase()+fldName.substring(1); //根据方法名和参数的数据类型(其实就是属性的类型),获得Method对象 Class paramTypes[]=new Class[1]; paramTypes[0]=fld.getType(); Method method=cls.getDeclaredMethod(methodName, paramTypes); //调用该method对象对应的方法 Object params[]=new Object[1]; params[0]=v; method.invoke(obj, params); } } return obj; } }
模拟用户类:
package cn.hncu.reflect.myBeanUtils; import java.util.HashMap; import java.util.Map; public class Client { public static void main(String[] args) { test(); } private static void test() { Map<String, Object> map=new HashMap<String, Object>(); map.put("uuid", "001"); map.put("name", "Jack"); map.put("age", 20); try { UserModel user=(UserModel) MyBeanUtils.populate(UserModel.class, map); System.out.println(user); } catch (Exception e) { e.printStackTrace(); } } }运行结果:
相关文章推荐
- 2、struts2开发action 的三种方法以及通配符、路径匹配原则、常量
- JavaSE多线程下载的实现
- Java 位运算
- Spring Transaction template 事务模板
- SpringMVC实战(一)-快速入门
- Spring AOP原理
- Spring bean的初始化和销毁
- Spring bean的三种注入方式
- Spring bean的三种创建方式
- Spring 简介
- SpringMVC实现国际化(i18n)
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- SpringMVC访问静态文件
- 深入理解Java的接口和抽象类
- 严重: Servlet.service() for servlet [spring] in context with path [/XX] threw exception [Request
- java8一句代码搞定基本类型数组转List
- MyEclipse的WEB项目到Eclipse的迁移
- java取整和java四舍五入方法
- struts-json简单小案例
- java路径问题