1、apache.commons包大家一定都用过,提供了许多优秀的API。对于Map<String,Object>这样的数据,apache.common提供了一个beanUtils的工具类来实现javabean的封装。
实例:
String sql1 = "SELECT * FROM app_teacher WHERE order_num>=? AND order_num<? AND owner_school_id=?"; Object[] args1 = { newNum, orderNum, schoolId }; List<Map<String, Object>> list = jdbcTemplate.queryForList(sql1, args1); List<Teacher> list2=new ArrayList<>(); Teacher teacher=null; for (Map<String, Object> map : list) { teacher=new Teacher(); try { BeanUtils.populate(teacher, map);//把map映射成实体 list2.add(teacher);//放入list中 } catch (Exception e) { e.printStackTrace(); } }
2、Java反射
一、什么是java反射
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,
那么就可以通过反射机制来获得类的所有信息。 在刚刚学习jdbc时用过一行代码,Class.forName("com.mysql.jdbc.Driver.class").newInstance();这就是反射,现在很多开 框架都用到反射机制,比如hibernate、struts、springMVC都是用反射机制实现的。
二、反射的优点
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。
三、反射的功能
1)只要给定类的全名,即可通过反射获取类的所有信息。
2)反射可以在程序运行时获取任意一个对象所属的类对象。
3)在运行时可以获取到类中所有属性对象,并对其操作(包括私有属性)。
4)在运行时可以获取到类中、父类中所有方法,并调用。
四、反射动态加载类,在运行期加载所需的类四种方式。
1.根据给定的类名来获得用于类加载
String classname = "cn.itcast.reflect.Person";// 来自配置文件
Class clazz = Class.forName(classname);// 此对象代表Person.class
2.如果拿到了对象,不知道是什么类型于获得对象的类型
Object obj = new Person();
Class clazz1 = obj.getClass();// 获得对象具体的类型
3.如果是明确地获得某个类的Class对象,主要用于传参
Class clazz2 = Person.class;
Object ob=clazz.newInstance()可以实例化一个对象
如果知道具体是什么类型,可以进行强制转换
五、Field对象概述
(1)Java.lang.reflect.Field类,是用于表示类中、接口中属性对象的类。
(2)可以操作类中私有,以及公有等全部属性和属性的信息。
(3)Field对象的常用方法介绍
getName()获得属性名称、 getType()获得属性类型、get(Object obj)取得obj对象中这个属性的值、
set(Object obj, Object value)向obj对象中这个属性赋值value、setAccessible(true)启用/禁用访问控制权限(对私有的属性操作,必须设置为true)
六、Method对象方法介绍
(1)java.lang.reflect.Method类是用于表示类中、接口中方法对象的类。
(2)可以操作类中私有,以及公有等全部方法。
(3)Method对象的常用方法介绍
getName()获得方法名称、getReturnType()获得方法返回值类型、invoke(Object obj, Object... args)利用obj对象调用该方法、getParameterTypes()获得方法所有参数类型,按照顺序返回Class数组、getDeclaredAnnotations()
获取方法的全部注解、getSimpleName()获得类名
七、利用反射来封装实体
public class ToEntityUtil { private final static Logger LOGGER = LoggerFactory .getLogger(ToEntityUtil.class); @SuppressWarnings("unchecked") public static <T> List<T> toEntity(Class<T> clazz, List<Map<String, Object>> list) { List<T> l = new ArrayList<T>(); try { for (Map<String, Object> map : list) { Object object = clazz.newInstance(); Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true);//一定要设置为true if (fields[i].getType().toString() .equals("class java.lang.String")) { fields[i].set(object, (String) map.get(fields[i].getName())); } if (fields[i].getType().toString() .equals("class java.lang.Integer")) { fields[i].set(object, (Integer) map.get(fields[i].getName())); } if (fields[i].getType().toString() .equals("class java.lang.Date")) { fields[i].set(object, (Date) map.get(fields[i].getName())); } //可以自定义多中年类型进行比较 } l.add((T) object); } } catch (Exception e) { LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>失败" + e); } return l; } }