java反射学习四
来源:互联网 发布:e卡销官网源码 编辑:程序博客网 时间:2024/06/05 16:51
从这一部分开始我们学习java反射的实际运用,在一些大型与数据库有关的项目中经常会用到java的反射,例如以前做过的一个保险项目,坐席接到电话进行录单操作,最后录单完成后点击保存会将页面上录入的数据保存到数据库中一系列表中,暂且用T来表示这一套表。然后清分系统会将T表数据通过JMS清分到相应的分公司,然后分公司进行交费操作,交费成功后分公司清分程序又会将所有的见费数据上传到总公司。最后总公司接到交费成功的标志后进行转数操作,转数也就是将所有T表的数据复制到C表中。完成这个功能有两种方法,一是直接对每个C表对象进行set操作,将T表对象的相应值赋进去,如果表比较多,这部分的代码会非常多,所以不可取。另一种就是利用反射来实现。现在我们看看如何利用反射来实现对象的复制操作。
1、源对象
package com.reflectcopy.dto;import java.io.Serializable;/** * 这个表用来模拟T表对象 * @author ibm * */public class TModel implements Serializable{private static final long serialVersionUID = 1L;private int id;private String name;private String pass;private String sex;public TModel(){}//使用反射必须要显示声明一个无参的构造方法public TModel(int id, String name, String pass, String sex) {super();this.id = id;this.name = name;this.pass = pass;this.sex = sex;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPass() {return pass;}public void setPass(String pass) {this.pass = pass;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}
2、目标对象
package com.reflectcopy.dto;import java.io.Serializable;/** * 这个类用来模拟C表的对象 * @author ibm * */public class CModel implements Serializable{private static final long serialVersionUID = 1L;private int id;private String name;private String pass;private String sex;public CModel(){}//使用反射必须要显示声明一个无参的构造方法public CModel(int id, String name, String pass, String sex) {super();this.id = id;this.name = name;this.pass = pass;this.sex = sex;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPass() {return pass;}public void setPass(String pass) {this.pass = pass;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}
3、测试类
package com.reflectcopy.test;import java.lang.reflect.Field;import java.lang.reflect.Method;import com.reflectcopy.dto.CModel;import com.reflectcopy.dto.TModel;public class ReflectCopyTest {public Object copy(Object sourceObject , Class targetObject) throws Exception {// 获得对象的类型Class<?> sourceclassType = sourceObject.getClass();Class<?> targetclassType = targetObject;// 通过默认构造方法创建一个新的对象Object objectCopy = targetclassType.getConstructor(new Class[] {}).newInstance();// 获得对象的所有属性Field fields[] = targetclassType.getDeclaredFields();for (int i = 0; i < fields.length; i++) {Field field = fields[i];String fieldName = field.getName();if(!fieldName.equals("serialVersionUID")){//去年序列化字段的赋值String firstLetter = fieldName.substring(0, 1).toUpperCase();// 获得和属性对应的getXXX()方法的名字String getMethodName = "get" + firstLetter + fieldName.substring(1);// 获得和属性对应的setXXX()方法的名字String setMethodName = "set" + firstLetter + fieldName.substring(1);// 获得和属性对应的getXXX()方法Method getMethod = sourceclassType.getMethod(getMethodName, new Class[] {});// 获得和属性对应的setXXX()方法Method setMethod = targetclassType.getMethod(setMethodName, new Class[] { field.getType() });// 调用原对象的getXXX()方法Object value = getMethod.invoke(sourceObject, new Object[] {});// 调用拷贝对象的setXXX()方法setMethod.invoke(objectCopy, new Object[] { value });}}return objectCopy;}public static void main(String[] args) throws Exception {TModel tModel = new TModel(1,"test","password","男");CModel cModel = (CModel) new ReflectCopyTest().copy(tModel,CModel.class);System.out.println("Copy information:" + cModel.getId() + " " + cModel.getName() + " " + cModel.getPass() + " " + cModel.getSex());}}
更多文章见:http://www.16boke.com
- java反射学习四
- Java反射学习总结(四)
- java反射笔记四
- java反射回顾<四>
- Java 反射学习(四)反射技术开发框架原理简单实现
- Java反射机制总结四
- Java反射四 成员变量
- java学习-反射
- Java反射学习
- Java反射学习
- java反射机制学习
- Java反射学习
- Java反射学习
- JAVA反射机制学习
- Java 反射 视频学习
- java反射的学习
- Java学习日志-反射
- java 反射基础学习
- sqlite数据类型、关键词及创建、修改、删除数据表
- C++ 关键字typeid
- Uva 10305 - Ordering Tasks
- iOS应用内支付(IAP)的那些坑
- Linux驱动开发--Linux字符设备驱动模板
- java反射学习四
- 关于IAP的破解
- C语言常见面试题
- 纪念一下自己一下午的愚蠢——KMP算法核心
- LESS/Sass/CoffeeScript图形编译工具推荐
- 百度地图开发( 基于新版本V2_1_1)— 覆盖物(3)_路线图层(RouteOverlay)
- GitHub+TortoiseGit
- Dom与Pull方式解析XML文件
- jsp显示中文文件名的图片 详细出处参考:http://www.jb51.net/article/37149.htm