利用java反射将结果集封装成为对象和对象集合
java反射机制是什么
反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法;
反射机制能够做什么
1、判断运行对象的所属类
2、构造任意一个类的对象
3、获取任意一个类的属性和方法
4、调用任意属性和方法
5、生成动态代理
利用反射将结果集封装成为对象或者集合(实测可用)
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;
}
/**
* 从结果集中获取出值
* @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数据库的列都是大写,所以才查找一次
fieldName = fieldName.toLowerCase();
try {
value = rs.getObject(fieldName);
return value;
} catch (SQLException e1) {
//结果集中没有对应的值,返回为空
return null;
}
}
}
/**
* 方法重载,
* @param fieldName
* @param rs 这个是封装过的结果集
* @return
*/
public static Object getFieldValue(String fieldName, RecordSet rs) {
Object value = null;
value = rs.getObject(fieldName);
return value;
}
/**
* 方法重载
* @param rs 封装过的结果集
* @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;
}
/**
* 把结果集封装成为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;
}
/**
* 把结果集封装成为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;
}
}
<link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/markdown_views-e9ce07d7e5.css">
</div>
利用java反射将结果集封装成为对象和对象集合的更多相关文章
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 packag ...
- 利用JAVA反射机制设计通用的DAO
利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...
- 利用Java反射机制对实体类的常用操作工具类ObjectUtil
代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...
- 利用Java反射根据类的名称获取属性信息和父类的属性信息
代码: import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- 利用Java反射机制将Bean转成Map
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- Java反射机制demo(一)—实例化Class对象,并获得其他类包名和类型
Java反射机制demo(一)——实例化Class对象,通过对象获得包名和类型 使用Java中的 本地类作为实验对象,避免自定义的类带来的一些不便. public static void main(S ...
- 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean
在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-lo ...
随机推荐
- MyBatis学习总结(11)——MyBatis动态Sql语句
MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...
- Day4下午解题报告
预计分数:30+30+0=60 实际分数:30+30+10=70 稳有个毛线用,,又拿不出成绩来,, T1 https://www.luogu.org/problem/show?pid=T15626 ...
- POJ Fence Repair(优先队列)
Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 51346 Accepted: 16857 De ...
- ListCtrl添加右键菜单(ListCtrl类里编辑,给ListCtrl 发送NM_RCLICK消息)
在开发中会用到右键菜单,我们来一起学习一下. 假如,我们现在已经准备好了列表,就差右键处理了. 1.在资源视图中的添加一个MENU,如图 2.给要添加右键菜单的ListCtrl子类,添加消息 按 ct ...
- System and method for controlling switching between VMM and VM using enabling value of VMM timer indicator and VMM timer value having a specified time
In one embodiment, a method includes transitioning control to a virtual machine (VM) from a virtual ...
- swift -结构体
// // main.swift // Struct-Demo-05 // import Foundation println("结构体測试!") //结构体和C语言的结构体不同 ...
- [D3JS] Add more map layer and color
import React, {Component} from 'react'; import * as d3 from 'd3'; import 'd3-geo'; import * as topoj ...
- lighttpd + php for android 安卓上的WEB服务器
lighttpd + php for android 安卓上的WEBSER 这个项目在 http://hex.ro/wp/blog/php-and-lighttpd-for-android 目前不支持 ...
- php数组函数(分类基本数组函数,栈函数,队列)
php数组函数(分类基本数组函数,栈函数,队列函数) 一.总结 1.常用数组函数 函数 描述 array() 创建数组. array_combine() 通过合并两个数组来创建一个新数组. array ...
- JQuery源码解析 目录
1. a.$查询符号就是放在沙盒里面的: window.jQuery = window.$ = jQuery; b.一个jQuery对象无 new 构造: eg: $("#text" ...