使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合操作
java反射機(jī)制是什么
反射機(jī)制是在運(yùn)行狀態(tài)中,可以知道任何一個(gè)類(lèi)的屬性和方法,并且調(diào)用類(lèi)的屬性和方法;
反射機(jī)制能夠做什么
1、判斷運(yùn)行對(duì)象的所屬類(lèi)
2、構(gòu)造任意一個(gè)類(lèi)的對(duì)象
3、獲取任意一個(gè)類(lèi)的屬性和方法
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();
// 獲取類(lèi)的屬性
Field[] declaredFields = clazz.getDeclaredFields();
// 獲取父類(lèi)或接口的公有屬性
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ì)象屬性中 這里可能是有屬性但是沒(méi)有相應(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;
}
/**
* 獲取類(lèi)的所有屬性,包括父類(lèi)和接口
* @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ù)庫(kù)的列都是大寫(xiě),所以才查找一次
fieldName = fieldName.toLowerCase();
try {
value = rs.getObject(fieldName);
return value;
} catch (SQLException e1) {
//結(jié)果集中沒(méi)有對(duì)應(yīng)的值,返回為空
return null;
}
}
}
/**
* 方法重載,
* @param fieldName
* @param rs 這個(gè)是封裝過(guò)的結(jié)果集
* @return
*/
public static Object getFieldValue(String fieldName, RecordSet rs) {
Object value = null;
value = rs.getObject(fieldName);
return value;
}
/**
* 方法重載
* @param rs 封裝過(guò)的結(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í)體類(lèi)
1.工具類(lèi)
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ù)名稱(chēng)
Enumeration<String> enu = req.getParameterNames();
//循環(huán)輸入的全部參數(shù)名稱(chēng)
while (enu.hasMoreElements()) {
String paramName = enu.nextElement();//取得參數(shù)名稱(chēng)
String paramValue = req.getParameter(paramName);
//取得屬性的類(lèi)型是為了取得參數(shù)的類(lèi)型,以確定method方法和是否轉(zhuǎn)型
Field field = cls.getDeclaredField(paramName); //取得指定名稱(chēng)的屬性 (實(shí)體類(lèi)里面
//取得指定的操作方法,以滿(mǎn)足反射調(diào)用
Method method = cls.getMethod("set"+StringTools.initcap(paramName),field.getType());
//根據(jù)類(lèi)型進(jìn)行數(shù)據(jù)的轉(zhuǎn)換,同時(shí)調(diào)用setter設(shè)置數(shù)據(jù)
//取得類(lèi)型
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;
}
-------此處模仿依賴(lài)注入
@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) {//首字母大寫(xiě)
return str.substring(0, 1).toUpperCase().concat(str.substring(1).toLowerCase());
}
}
3.新增學(xué)生的jsp頁(yè)面
<%-- 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é)生的信息的頁(yè)面
<%--
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>成績(jī):${student.score}</h1>
</body>
</html>
以上這篇使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- java中封裝JDBC工具類(lèi)的實(shí)例分析
- Java JDBC自定義封裝工具類(lèi)的步驟和完整代碼
- Java Mail郵件發(fā)送如何實(shí)現(xiàn)簡(jiǎn)單封裝
- 基于selenium-java封裝chrome、firefox、phantomjs實(shí)現(xiàn)爬蟲(chóng)
- Java 封裝基礎(chǔ)知識(shí)
- Java面向?qū)ο蟪绦蛟O(shè)計(jì):類(lèi)的定義,靜態(tài)變量,成員變量,構(gòu)造函數(shù),封裝與私有,this概念與用法詳解
- Java封裝數(shù)組之改進(jìn)為泛型數(shù)組操作詳解
- 教你用java完美封裝微信模板消息的發(fā)送動(dòng)態(tài)
相關(guān)文章
Intellij無(wú)法創(chuàng)建java文件解決方案
這篇文章主要介紹了Intellij無(wú)法創(chuàng)建java文件解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
IDEA2022搭建Spring?Cloud多模塊項(xiàng)目的詳細(xì)過(guò)程
這篇文章主要介紹了IDEA2022搭建Spring?Cloud多模塊項(xiàng)目,網(wǎng)上有很多教程父模塊都是通過(guò)maven的方式創(chuàng)建的,然后子模塊是通過(guò)Spring?Initalizr方式創(chuàng)建,這種方式父模塊無(wú)法管理子模塊的依賴(lài)仲裁,需要每個(gè)子模塊自行管理,就失去了父模塊的用處了2022-10-10
java?安全?ysoserial?CommonsCollections6?分析
這篇文章主要介紹了java?安全?ysoserial?CommonsCollections6示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Java?延時(shí)隊(duì)列及簡(jiǎn)單使用方式詳解
這篇文章主要介紹了Java延時(shí)隊(duì)列簡(jiǎn)單使用方式,通過(guò)本文學(xué)習(xí)知道延時(shí)隊(duì)列是什么可以用來(lái)干什么,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
Java?Git?Commit?Message使用規(guī)范
這篇文章主要介紹了Java?Git?Commit?Message使用規(guī)范,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-08-08
淺談java對(duì)象轉(zhuǎn)json,數(shù)字精確出現(xiàn)丟失問(wèn)題
下面小編就為大家?guī)?lái)一篇淺談java對(duì)象轉(zhuǎn)json, 數(shù)字精確出現(xiàn)丟失問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
詳談Java多線(xiàn)程的幾個(gè)常用關(guān)鍵字
下面小編就為大家?guī)?lái)一篇詳談Java多線(xiàn)程的幾個(gè)常用關(guān)鍵字。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
如何使用IDEA 搭建 SpringCloud 項(xiàng)目
所謂微服務(wù),就是要把整個(gè)業(yè)務(wù)模塊拆分成多個(gè)各司其職的小模塊,做到單一職責(zé)原則,不會(huì)重復(fù)開(kāi)發(fā)相同的業(yè)務(wù)代碼,實(shí)現(xiàn)真正意義上的高內(nèi)聚、低耦合,這篇文章主要介紹了如何使用IDEA 搭建 SpringCloud 項(xiàng)目,需要的朋友可以參考下2023-11-11

