您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合的案例的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。
java反射機(jī)制是什么
反射機(jī)制是在運(yùn)行狀態(tài)中,可以知道任何一個(gè)類的屬性和方法,并且調(diào)用類的屬性和方法;
反射機(jī)制能夠做什么
1、判斷運(yùn)行對(duì)象的所屬類
2、構(gòu)造任意一個(gè)類的對(duì)象
3、獲取任意一個(gè)類的屬性和方法
4、調(diào)用任意屬性和方法
5、生成動(dòng)態(tài)代理
利用反射將結(jié)果集封裝成為對(duì)象或者集合(實(shí)測(cè)可用)
package coral.base.util; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import wfc.service.database.RecordSet; public class ReflectUtils { /** * 將一個(gè)map集合封裝成為bean對(duì)象 * * @param param * @param clazz * @return */ public static <T> T MapToBean(Map<String, Object> param, Class<?> clazz) { Object value = null; Class[] paramTypes = new Class[1]; Object obj = null; try { obj = clazz.newInstance(); // 獲取類的屬性 Field[] declaredFields = clazz.getDeclaredFields(); // 獲取父類或接口的公有屬性 Field[] superFields = clazz.getSuperclass().getFields(); List<Field[]> list = new ArrayList<Field[]>(); if (declaredFields != null) { list.add(declaredFields); } if (superFields != null) { list.add(superFields); } for (Field[] fields : list) { for (Field field : fields) { String fieldName = field.getName(); // 獲取屬性對(duì)應(yīng)的值ֵ value = param.get(fieldName); // 把值設(shè)置進(jìn)入對(duì)象屬性中 這里可能是有屬性但是沒有相應(yīng)的set方法,所以要做異常處理 try { PropertyDescriptor pd = new PropertyDescriptor( fieldName, clazz); Method method = pd.getWriteMethod(); method.invoke(obj, new Object[] { value }); } catch (Exception e1) { } } } } catch (Exception e1) { } return (T) obj; } /** * 獲取類的所有屬性,包括父類和接口 * @param clazz * @return */ public static List<Field[]> getBeanFields(Class<?> clazz) { List<Field[]> list = new ArrayList<Field[]>(); Field[] declaredFields = clazz.getDeclaredFields(); Field[] superFields = clazz.getSuperclass().getFields(); if (declaredFields != null) { list.add(declaredFields); } if (superFields != null) { list.add(superFields); } return list; } /** * 從結(jié)果集中獲取出值 * @param fieldName * @param rs * @return */ public static Object getFieldValue(String fieldName, ResultSet rs) { Object value = null; try { //捕獲值不存在的異常 value = rs.getObject(fieldName); return value; } catch (SQLException e) { //oracle數(shù)據(jù)庫的列都是大寫,所以才查找一次 fieldName = fieldName.toLowerCase(); try { value = rs.getObject(fieldName); return value; } catch (SQLException e1) { //結(jié)果集中沒有對(duì)應(yīng)的值,返回為空 return null; } } } /** * 方法重載, * @param fieldName * @param rs 這個(gè)是封裝過的結(jié)果集 * @return */ public static Object getFieldValue(String fieldName, RecordSet rs) { Object value = null; value = rs.getObject(fieldName); return value; } /** * 方法重載 * @param rs 封裝過的結(jié)果集 * @param clazz * @return */ public static <T> T RSToBean(RecordSet rs, Class<?> clazz) { Object obj = null; List<Field[]> list = getBeanFields(clazz); try { obj = clazz.newInstance(); for (Field[] fields : list) { for (Field field : fields) { String fieldName = field.getName(); // String fieldName = field.getName();ֵ Object value = getFieldValue(fieldName, rs); try { PropertyDescriptor pd = new PropertyDescriptor( fieldName, clazz); Method method = pd.getWriteMethod(); method.invoke(obj, new Object[] { value }); } catch (Exception e1) { } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return (T) obj; } /** * 把結(jié)果集封裝成為bean對(duì)象 * @param rs * @param clazz * @return */ public static <T> T RSToBean(ResultSet rs, Class<?> clazz) { Object obj = null; List<Field[]> list = getBeanFields(clazz); try { while (rs.next()) { obj = clazz.newInstance(); for (Field[] fields : list) { for (Field field : fields) { String fieldName = field.getName(); // String fieldName = field.getName();ֵ Object value = getFieldValue(fieldName, rs); PropertyDescriptor pd = new PropertyDescriptor( fieldName, clazz); Method method = pd.getWriteMethod(); method.invoke(obj, new Object[] { value }); } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return (T) obj; } /** * 把結(jié)果集封裝成為L(zhǎng)ist * * @param rs * @param clazz * @return */ public static <T> List<T> RsToList(ResultSet rs, Class<?> clazz) { ArrayList<T> objList = new ArrayList<T>(); // 獲取所有的屬性 List<Field[]> list = getBeanFields(clazz); try { while (rs.next()) { // 定義臨時(shí)變量 Object tempObeject = clazz.newInstance(); // 添加到屬性中 for (Field[] fields : list) { for (Field field : fields) { String fieldName = field.getName(); // 獲取屬性值ֵ Object value = getFieldValue(fieldName, rs); PropertyDescriptor pd = new PropertyDescriptor( fieldName, clazz); Method method = pd.getWriteMethod(); method.invoke(tempObeject, new Object[] { value }); } } objList.add((T) tempObeject); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return objList; } }
補(bǔ)充知識(shí):java反射自動(dòng)封裝值到實(shí)體類
1.工具類
package com.util; import com.entity.Student; import javax.servlet.ServletRequest; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Enumeration; /** * Created by wq on 2017/8/30. */ public class BeanOperateTools { /* 利用反射進(jìn)行所以請(qǐng)求參數(shù)的設(shè)置,要求參數(shù)名與屬性名一致 */ /** * * @param obj * @param req * @param datePatern 將字符串變?yōu)槿掌跁r(shí)間格式化的字符串 * @throws Exception */ public static void setValue(Object obj, ServletRequest req,String datePatern) throws Exception {//設(shè)置屬性的內(nèi)容 { System.out.println("進(jìn)了setValue方法....."); //取得class對(duì)象 Class<?> cls = obj.getClass(); //取得輸入的全部參數(shù)名稱 Enumeration<String> enu = req.getParameterNames(); //循環(huán)輸入的全部參數(shù)名稱 while (enu.hasMoreElements()) { String paramName = enu.nextElement();//取得參數(shù)名稱 String paramValue = req.getParameter(paramName); //取得屬性的類型是為了取得參數(shù)的類型,以確定method方法和是否轉(zhuǎn)型 Field field = cls.getDeclaredField(paramName); //取得指定名稱的屬性 (實(shí)體類里面 //取得指定的操作方法,以滿足反射調(diào)用 Method method = cls.getMethod("set"+StringTools.initcap(paramName),field.getType()); //根據(jù)類型進(jìn)行數(shù)據(jù)的轉(zhuǎn)換,同時(shí)調(diào)用setter設(shè)置數(shù)據(jù) //取得類型 String fieldType=field.getType().getSimpleName(); if ("string".equalsIgnoreCase(fieldType)) { method.invoke(obj,paramValue); }else if ("integer".equalsIgnoreCase(fieldType)||"int".equalsIgnoreCase(fieldType)){ method.invoke(obj,Integer.parseInt(paramValue)); }else if ("double".equalsIgnoreCase(fieldType)){ method.invoke(obj,Double.parseDouble(paramValue)); }else if ("date".equalsIgnoreCase(fieldType)){ method.invoke(obj,new SimpleDateFormat(datePatern).parse(paramValue)); } } } } }
2.servlet中調(diào)用此方法
package com.servlet; import com.entity.Student; import com.sun.xml.internal.bind.v2.runtime.reflect.opt.FieldAccessor_Double; import com.util.BeanOperateTools; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Enumeration; /** * Created by wq on 2017/8/22. */ @WebServlet(name = "studentServlet", urlPatterns = {"/StudentServlet"}) public class StudentServlet extends HttpServlet { //private Student stu = new Student(); private Student student=new Student(); public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } -------此處模仿依賴注入 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); try { BeanOperateTools.setValue(this.getStudent(),req,"yyyy-MM-dd"); } catch (Exception e) { e.printStackTrace(); } req.setAttribute("student",this.student); req.getRequestDispatcher("student_insert_do.jsp").forward(req,resp); // Class<?> cls= this.stu.getClass(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } public String initcap(String str) {//首字母大寫 return str.substring(0, 1).toUpperCase().concat(str.substring(1).toLowerCase()); } }
3.新增學(xué)生的jsp頁面
<%-- Created by IntelliJ IDEA. User: wq Date: 2017/8/21 Time: 23:25 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="StudentServlet" method="post"> 姓名:<input type="text" name="name"><br> 年齡:<input type="text" name="age"><br> 成績(jī):<input type="text" name="score"><br> <input type="submit" value="輸入"> <input type="reset" value="重置"> </form> </body> </html>
4。展示學(xué)生的信息的頁面
<%-- Created by IntelliJ IDEA. User: wq Date: 2017/8/21 Time: 23:25 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h2>姓名:${student.name}</h2> <h2>年齡:${student.age}</h2> <h2>成績(jī):${student.score}</h2> </body> </html>
感謝各位的閱讀!關(guān)于使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合的案例就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。