使用java反射将结果集封装成为对象和对象集合操作
java反射机制是什么
反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法;
反射机制能够做什么
1、判断运行对象的所属类
2、构造任意一个类的对象
3、获取任意一个类的属性和方法
4、调用任意属性和方法
5、生成动态代理
利用反射将结果集封装成为对象或者集合(实测可用)
packagecoral.base.util;
importjava.beans.IntrospectionException;
importjava.beans.PropertyDescriptor;
importjava.lang.reflect.Field;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importwfc.service.database.RecordSet;
publicclassReflectUtils{
/**
*将一个map集合封装成为bean对象
*
*@paramparam
*@paramclazz
*@return
*/
publicstaticTMapToBean(Mapparam,Class>clazz){
Objectvalue=null;
Class[]paramTypes=newClass[1];
Objectobj=null;
try{
obj=clazz.newInstance();
//获取类的属性
Field[]declaredFields=clazz.getDeclaredFields();
//获取父类或接口的公有属性
Field[]superFields=clazz.getSuperclass().getFields();
Listlist=newArrayList();
if(declaredFields!=null){
list.add(declaredFields);
}
if(superFields!=null){
list.add(superFields);
}
for(Field[]fields:list){
for(Fieldfield:fields){
StringfieldName=field.getName();
//获取属性对应的值ֵ
value=param.get(fieldName);
//把值设置进入对象属性中这里可能是有属性但是没有相应的set方法,所以要做异常处理
try{
PropertyDescriptorpd=newPropertyDescriptor(
fieldName,clazz);
Methodmethod=pd.getWriteMethod();
method.invoke(obj,newObject[]{value});
}catch(Exceptione1){
}
}
}
}catch(Exceptione1){
}
return(T)obj;
}
/**
*获取类的所有属性,包括父类和接口
*@paramclazz
*@return
*/
publicstaticListgetBeanFields(Class>clazz){
Listlist=newArrayList();
Field[]declaredFields=clazz.getDeclaredFields();
Field[]superFields=clazz.getSuperclass().getFields();
if(declaredFields!=null){
list.add(declaredFields);
}
if(superFields!=null){
list.add(superFields);
}
returnlist;
}
/**
*从结果集中获取出值
*@paramfieldName
*@paramrs
*@return
*/
publicstaticObjectgetFieldValue(StringfieldName,ResultSetrs){
Objectvalue=null;
try{
//捕获值不存在的异常
value=rs.getObject(fieldName);
returnvalue;
}catch(SQLExceptione){
//oracle数据库的列都是大写,所以才查找一次
fieldName=fieldName.toLowerCase();
try{
value=rs.getObject(fieldName);
returnvalue;
}catch(SQLExceptione1){
//结果集中没有对应的值,返回为空
returnnull;
}
}
}
/**
*方法重载,
*@paramfieldName
*@paramrs这个是封装过的结果集
*@return
*/
publicstaticObjectgetFieldValue(StringfieldName,RecordSetrs){
Objectvalue=null;
value=rs.getObject(fieldName);
returnvalue;
}
/**
*方法重载
*@paramrs封装过的结果集
*@paramclazz
*@return
*/
publicstaticTRSToBean(RecordSetrs,Class>clazz){
Objectobj=null;
Listlist=getBeanFields(clazz);
try{
obj=clazz.newInstance();
for(Field[]fields:list){
for(Fieldfield:fields){
StringfieldName=field.getName();
//StringfieldName=field.getName();ֵ
Objectvalue=getFieldValue(fieldName,rs);
try{
PropertyDescriptorpd=newPropertyDescriptor(
fieldName,clazz);
Methodmethod=pd.getWriteMethod();
method.invoke(obj,newObject[]{value});
}catch(Exceptione1){
}
}
}
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
return(T)obj;
}
/**
*把结果集封装成为bean对象
*@paramrs
*@paramclazz
*@return
*/
publicstaticTRSToBean(ResultSetrs,Class>clazz){
Objectobj=null;
Listlist=getBeanFields(clazz);
try{
while(rs.next()){
obj=clazz.newInstance();
for(Field[]fields:list){
for(Fieldfield:fields){
StringfieldName=field.getName();
//StringfieldName=field.getName();ֵ
Objectvalue=getFieldValue(fieldName,rs);
PropertyDescriptorpd=newPropertyDescriptor(
fieldName,clazz);
Methodmethod=pd.getWriteMethod();
method.invoke(obj,newObject[]{value});
}
}
}
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
return(T)obj;
}
/**
*把结果集封装成为List
*
*@paramrs
*@paramclazz
*@return
*/
publicstaticListRsToList(ResultSetrs,Class>clazz){
ArrayListobjList=newArrayList();
//获取所有的属性
Listlist=getBeanFields(clazz);
try{
while(rs.next()){
//定义临时变量
ObjecttempObeject=clazz.newInstance();
//添加到属性中
for(Field[]fields:list){
for(Fieldfield:fields){
StringfieldName=field.getName();
//获取属性值ֵ
Objectvalue=getFieldValue(fieldName,rs);
PropertyDescriptorpd=newPropertyDescriptor(
fieldName,clazz);
Methodmethod=pd.getWriteMethod();
method.invoke(tempObeject,newObject[]{value});
}
}
objList.add((T)tempObeject);
}
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnobjList;
}
}
补充知识:java反射自动封装值到实体类
1.工具类
packagecom.util;
importcom.entity.Student;
importjavax.servlet.ServletRequest;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
importjava.text.SimpleDateFormat;
importjava.util.Enumeration;
/**
*Createdbywqon2017/8/30.
*/
publicclassBeanOperateTools{
/*
利用反射进行所以请求参数的设置,要求参数名与属性名一致
*/
/**
*
*@paramobj
*@paramreq
*@paramdatePatern将字符串变为日期时间格式化的字符串
*@throwsException
*/
publicstaticvoidsetValue(Objectobj,ServletRequestreq,StringdatePatern)
throwsException{//设置属性的内容
{
System.out.println("进了setValue方法.....");
//取得class对象
Class>cls=obj.getClass();
//取得输入的全部参数名称
Enumerationenu=req.getParameterNames();
//循环输入的全部参数名称
while(enu.hasMoreElements()){
StringparamName=enu.nextElement();//取得参数名称
StringparamValue=req.getParameter(paramName);
//取得属性的类型是为了取得参数的类型,以确定method方法和是否转型
Fieldfield=cls.getDeclaredField(paramName);//取得指定名称的属性(实体类里面
//取得指定的操作方法,以满足反射调用
Methodmethod=cls.getMethod("set"+StringTools.initcap(paramName),field.getType());
//根据类型进行数据的转换,同时调用setter设置数据
//取得类型
StringfieldType=field.getType().getSimpleName();
if("string".equalsIgnoreCase(fieldType)){
method.invoke(obj,paramValue);
}elseif("integer".equalsIgnoreCase(fieldType)||"int".equalsIgnoreCase(fieldType)){
method.invoke(obj,Integer.parseInt(paramValue));
}elseif("double".equalsIgnoreCase(fieldType)){
method.invoke(obj,Double.parseDouble(paramValue));
}elseif("date".equalsIgnoreCase(fieldType)){
method.invoke(obj,newSimpleDateFormat(datePatern).parse(paramValue));
}
}
}
}
}
2.servlet中调用此方法
packagecom.servlet;
importcom.entity.Student;
importcom.sun.xml.internal.bind.v2.runtime.reflect.opt.FieldAccessor_Double;
importcom.util.BeanOperateTools;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.IOException;
importjava.lang.reflect.Field;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Enumeration;
/**
*Createdbywqon2017/8/22.
*/
@WebServlet(name="studentServlet",urlPatterns={"/StudentServlet"})
publicclassStudentServletextendsHttpServlet{
//privateStudentstu=newStudent();
privateStudentstudent=newStudent();
publicStudentgetStudent(){
returnstudent;
}
publicvoidsetStudent(Studentstudent){
this.student=student;
}
-------此处模仿依赖注入
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
req.setCharacterEncoding("UTF-8");
try{
BeanOperateTools.setValue(this.getStudent(),req,"yyyy-MM-dd");
}catch(Exceptione){
e.printStackTrace();
}
req.setAttribute("student",this.student);
req.getRequestDispatcher("student_insert_do.jsp").forward(req,resp);
//Class>cls=this.stu.getClass();
}
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
this.doGet(req,resp);
}
publicStringinitcap(Stringstr){//首字母大写
returnstr.substring(0,1).toUpperCase().concat(str.substring(1).toLowerCase());
}
}
3.新增学生的jsp页面
<%-- CreatedbyIntelliJIDEA. User:wq Date:2017/8/21 Time:23:25 TochangethistemplateuseFile|Settings|FileTemplates. --%> <%@pagecontentType="text/html;charset=UTF-8"language="java"%>Title 姓名:
年龄:
成绩:
4。展示学生的信息的页面
<%-- CreatedbyIntelliJIDEA. User:wq Date:2017/8/21 Time:23:25 TochangethistemplateuseFile|Settings|FileTemplates. --%> <%@pagecontentType="text/html;charset=UTF-8"language="java"%>Title 姓名:${student.name}
年龄:${student.age}
成绩:${student.score}
以上这篇使用java反射将结果集封装成为对象和对象集合操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。