利用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 ...
随机推荐
- dig---域名查询
dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. QUESTION SECTION 这部分是提问,显示你要查询的域名 ANSWER SECTION 即答案,显示查询到的域名对应的IP ...
- 怎样解决git提交代码冲突
当我们使用git提交代码时,别人可能也同一时候改动了我们改动的文件,可是别人的先合入到配置库里边,这样当我们的提交要合入时.就会产生冲突,能够使用下面步骤来解决冲突: (1) git rebase ...
- 33.promise future多线程通信
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <thread> #include <futur ...
- Vue Invalid handler for event "": got undefined
原因:绑定的方法不是放在methods:{}里.比如我把绑定的函数写在了computed:{}里就会报这个错.
- 【Educational Codeforces Round 35 D】Inversion Counting
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 排列中交换任意两个数字. 排列的逆序对个数的奇偶性会发生变化. 翻转这个过程其实就是len/2对数字发生交换. 交换了偶数次的话,不 ...
- [Vue + TS] Use Dependency Injection in Vue Using @Inject and @Provide Decorators with TypeScript
Vue 2.2 introduced a simple dependency injection system, allowing you to use provide and inject in y ...
- 二、MongoDB基础知识
1.文档是MongoDB的核心概念.文档就是键值对的一个有序集{'msg':'hello','foo':3}.类似于python中的有序字典. 需要注意的是: #1.文档中的键/值对是有序的. #2. ...
- [UWP]为什么ContentControl的ContentTemplate里放两个ContentPresenter会出问题(绕口)
原文:[UWP]为什么ContentControl的ContentTemplate里放两个ContentPresenter会出问题(绕口) 1. 简单的HeaderedContentControl 上 ...
- 三星Galaxy Tab S2上市,压制苹果之心凸显
平板市场正在迎来史上最为关键的一次PK,众所周知,平板市场的苹果和三星一直是行业的领头羊,而在激烈的竞争中.三星平板似乎后劲更足.众多性能优异的产品频频推出.平板之王的称谓呼之欲出. 去年三星 ...
- SSH进阶(2)——用Struts拦截器实现登陆限制
拦截器从字面意思来看就是限制.限制用户訪问某些网页.在Action提出请求之前用拦截器来做权限设置,让符合的用户跳入对应的界面中.近期做的一个商城项目中就用到了自己定义的拦截器,实现了一个简单的ses ...