最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用java反射將結(jié)果集封裝成為對象和對象集合操作

 更新時間:2020年08月20日 10:33:28   作者:alleged  
這篇文章主要介紹了使用java反射將結(jié)果集封裝成為對象和對象集合操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

java反射機制是什么

反射機制是在運行狀態(tài)中,可以知道任何一個類的屬性和方法,并且調(diào)用類的屬性和方法;

反射機制能夠做什么

1、判斷運行對象的所屬類

2、構造任意一個類的對象

3、獲取任意一個類的屬性和方法

4、調(diào)用任意屬性和方法

5、生成動態(tài)代理

利用反射將結(jié)果集封裝成為對象或者集合(實測可用)

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 {
  /**
   * 將一個map集合封裝成為bean對象
   * 
   * @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();
          // 獲取屬性對應的值ֵ
          value = param.get(fieldName);
          // 把值設置進入對象屬性中 這里可能是有屬性但是沒有相應的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é)果集中沒有對應的值,返回為空
        return null;
      }

    }
  }
  /**
   * 方法重載,
   * @param fieldName
   * @param rs 這個是封裝過的結(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對象
   * @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é)果集封裝成為List
   * 
   * @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()) {
        // 定義臨時變量
        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;
  }
}

補充知識:java反射自動封裝值到實體類

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 {

  /*
  利用反射進行所以請求參數(shù)的設置,要求參數(shù)名與屬性名一致
   */

  /**
   *
   * @param obj
   * @param req
   * @param datePatern 將字符串變?yōu)槿掌跁r間格式化的字符串
   * @throws Exception
   */
  public static void setValue(Object obj, ServletRequest req,String datePatern)
      throws Exception {//設置屬性的內(nèi)容
    {
      System.out.println("進了setValue方法.....");
      //取得class對象
      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); //取得指定名稱的屬性 (實體類里面
        //取得指定的操作方法,以滿足反射調(diào)用
        Method method = cls.getMethod("set"+StringTools.initcap(paramName),field.getType());
        //根據(jù)類型進行數(shù)據(jù)的轉(zhuǎn)換,同時調(diào)用setter設置數(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.新增學生的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>
  成績:<input type="text" name="score"><br>
  <input type="submit" value="輸入">
  <input type="reset" value="重置">
</form>
</body>
</html>

4。展示學生的信息的頁面

<%--
 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>
 <h1>姓名:${student.name}</h1>
 <h1>年齡:${student.age}</h1>
 <h1>成績:${student.score}</h1>

</body>
</html>

以上這篇使用java反射將結(jié)果集封裝成為對象和對象集合操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 關于使用swagger整合springMVC的方法

    關于使用swagger整合springMVC的方法

    在平時開發(fā)寫接口文檔的工作時,一般都是word文檔,帶來書寫麻煩、維護麻煩的問題,比如改了源代碼忘了更新文檔、解釋不明確帶來歧義、無法在線嘗試等等,swagger可以有效解決這類問題,需要的朋友可以參考下
    2023-04-04
  • 詳解Java中的OkHttp?JSONP爬蟲

    詳解Java中的OkHttp?JSONP爬蟲

    一般在java平臺上,我們會使用apache?httpclient作為http客戶端,用于發(fā)送?http?請求,并對響應進行處理,這篇文章主要介紹了詳解Java中的OkHttp?JSONP爬蟲的相關資料,需要的朋友可以參考下
    2022-07-07
  • 求最大子數(shù)組之和的方法解析(2種可選)

    求最大子數(shù)組之和的方法解析(2種可選)

    本文主要對求最大子數(shù)組之和的方法進行詳細解析,列了兩種方法供大家選擇借鑒,需要的朋友一起來看下吧
    2016-12-12
  • Java中final作用于變量、參數(shù)、方法及類該如何處理

    Java中final作用于變量、參數(shù)、方法及類該如何處理

    Java中的final關鍵字非常重要,它可以應用于類、方法以及變量,下面這篇文章主要給大家介紹了關于Java中final作用于變量、參數(shù)、方法及類該如何處理的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • Java微信二次開發(fā)(二) Java微信文本消息接口請求與發(fā)送

    Java微信二次開發(fā)(二) Java微信文本消息接口請求與發(fā)送

    這篇文章主要為大家詳細介紹了Java微信二次開發(fā)第二篇,Java微信文本消息接口請求與發(fā)送功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • JAVAWEB實現(xiàn)簡單的商城項目(一)實例代碼解析

    JAVAWEB實現(xiàn)簡單的商城項目(一)實例代碼解析

    本文給大家分享一段實例代碼給大家介紹JAVAWEB實現(xiàn)簡單的商城項目(一),非常具有參考價值,感興趣的朋友一起學習吧
    2016-02-02
  • java如何將map數(shù)據(jù)存入到實體類對象中

    java如何將map數(shù)據(jù)存入到實體類對象中

    在Java編程中,經(jīng)常需要將Map集合中的數(shù)據(jù)轉(zhuǎn)換為實體類對象,這可以通過反射機制實現(xiàn),即通過遍歷Map對象,使用反射根據(jù)鍵名對應實體類的屬性名,動態(tài)調(diào)用setter方法將值設置到實體對象中,這樣的操作使得數(shù)據(jù)從Map結(jié)構轉(zhuǎn)移到了具體的JavaBean中,便于后續(xù)的操作和管理
    2024-09-09
  • Spring中@PathVariable和@RequestParam注解的用法區(qū)別

    Spring中@PathVariable和@RequestParam注解的用法區(qū)別

    這篇文章主要介紹了Spring中@PathVariable和@RequestParam注解的用法區(qū)別,@PathVariable 是 Spring 框架中的一個注解,用于將 URL 中的變量綁定到方法的參數(shù)上,它通常用于處理 RESTful 風格的請求,從 URL 中提取參數(shù)值,并將其傳遞給方法進行處理,需要的朋友可以參考下
    2024-01-01
  • 詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置

    詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置

    本篇文章主要介紹了詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • java如何用反射將一個對象復制給另一個對象

    java如何用反射將一個對象復制給另一個對象

    這篇文章主要介紹了java如何用反射將一個對象復制給另一個對象問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

于都县| 新绛县| 噶尔县| 宜春市| 封丘县| 德阳市| 离岛区| 衡南县| 华池县| 临沭县| 略阳县| 城步| 磐安县| 会宁县| 淳安县| 东方市| 麻栗坡县| 普兰店市| 福州市| 商河县| 顺平县| 观塘区| 平塘县| 田东县| 鄯善县| 高青县| 永春县| 朔州市| 田东县| 沽源县| 马尔康县| 平和县| 吉木萨尔县| 青川县| 翼城县| 惠东县| 保亭| 五指山市| 大安市| 绥阳县| 成武县|