`
阅读更多

java如何填充对象中的时间属性呢?

前提:不知道对象具体类型.

解决方法:使用反射

 

/***
	 * 把对象中的列,类型为时间的都设置为当前时间
	 * @param obj
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public static void fillTimeForObj(Object obj) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
		List<Field> fieldsList=getAllFieldList(obj.getClass());
		int size=fieldsList.size();
		for(int i=0;i<size;i++){
			Field f=fieldsList.get(i);
			String typeName=f.getType().getName();
			if(typeName.equals("java.sql.Timestamp")||typeName.equals("java.util.Date")){
				setObjectValue(obj, f, TimeHWUtil.getCurrentTimestamp());
			}else if(typeName.equals("java.sql.Date")){
				setObjectValue(obj, f, new java.util.Date());
			}
		}
	}

 依赖的方法:

 

 

/***
	 * get all field ,including fields in father/super class
	 * 
	 * @param clazz
	 * @return
	 */
	public static List<Field> getAllFieldList(Class<?> clazz) {
		List<Field> fieldsList = new ArrayList<Field>();// return object
		if (clazz == null) {
			return null;
		}

		Class<?> superClass = clazz.getSuperclass();// father class
		if (!superClass.getName().equals(Object.class.getName()))/*
																 * java.lang.Object
																 */{

			// System.out.println("has father");
			fieldsList.addAll(getAllFieldList(superClass));// Recursive
		}
		Field[] fields = clazz.getDeclaredFields();
		for (int i = 0; i < fields.length; i++) {
			Field field = fields[i];
			// 排除因实现Serializable 接口而产生的属性serialVersionUID
			if (!field.getName().equals("serialVersionUID")) {
				fieldsList.add(field);
			}
		}
		return fieldsList;
	}
/***
	 * 设置对象的属性值。
	 * 
	 * @param obj
	 * @param propertyName
	 *            : property name
	 * @param propertyValue
	 *            : value of property<br> must be String or Field
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public static void setObjectValue(Object obj, Object propertyName,
			Object propertyValue) throws SecurityException,
			NoSuchFieldException, IllegalArgumentException,
			IllegalAccessException {
		if (ValueWidget.isNullOrEmpty(propertyName)
				|| ValueWidget.isNullOrEmpty (propertyValue)) {
			return;
		}
		Class<?> clazz = obj.getClass();
		Field name = null;
		if(propertyName instanceof String){
		name=getSpecifiedField(clazz, (String)propertyName);
		}else{
			name=(Field)propertyName;
		}
		name.setAccessible(true);
		name.set(obj, propertyValue);

	}
/***
	 * Get Specified Field
	 * 
	 * @param clazz
	 * @param fieldName
	 * @return
	 */
	public static Field getSpecifiedField(Class<?> clazz, String fieldName) {
		Field f = null;
		if (ValueWidget.isNullOrEmpty(clazz)) {
			return null;
		}
		try {
			f = clazz.getDeclaredField(fieldName);
		} catch (NoSuchFieldException e) {
			return getSpecifiedField(clazz.getSuperclass()/*
														 * may be null if it is
														 * Object .
														 */, fieldName);
			// e.printStackTrace();
		}
		return f;
	}

 

把A对象的时间属性的值设置到B对象中

/***
	 * 使用spring MVC保存对象时,对象的createTime(时间类型的属性)没有注入进来,
	 * <br>这时需要后台先通过id获取持久化对象,然后手动注入
	 * @param editedObj
	 * @param persistentObj
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public static void fillTimeForEditedObj(Object editedObj,Object persistentObj) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
		if(!editedObj.getClass().getName().equals(persistentObj.getClass().getName())){
			throw new RuntimeException("Two object type should be the same ,but is different .");
		}
		List<Field> fieldsList=getAllFieldList(editedObj.getClass());
		int size=fieldsList.size();
		for(int i=0;i<size;i++){
			Field f=fieldsList.get(i);
			String typeName=f.getType().getName();
			if(editedObj instanceof java.util.Date || typeName.equals("java.sql.Timestamp")||typeName.equals("java.util.Date")||typeName.equals("java.sql.Date")){
				Object valueEdited=getObjectValue(editedObj, f);
				Object valuePersistent=getObjectValue(persistentObj, f);
				if(ValueWidget.isNullOrEmpty(valueEdited)&&(!ValueWidget.isNullOrEmpty(valuePersistent))){
					setObjectValue(editedObj, f, valuePersistent);
				}
				
			}
		}
	}

 参考:

Java 反射常用方法

 

2
2
分享到:
评论

相关推荐

    自动填充时间实例

    在IT行业中,自动填充时间是一项常见的功能,尤其在数据录入、日志记录或者表单填写等场景下,能够极大地提高工作效率。本实例聚焦于如何在项目中实现文本框的自动填充时间功能。以下是对这个主题的详细阐述: 一、...

    快速填充一定区域_颗粒工厂API_EDEM快速填充一定区域颗粒工厂_

    5. **数据记录与分析**:API还允许用户记录填充过程中的关键数据,如填充时间、颗粒分布、能量消耗等,以便于后期分析和优化。 6. **myFactory.dll**:这是一个动态链接库文件,很可能是EDEM API提供的函数库,用于...

    MyBatis拦截器:给参数对象属性赋值的实例

    这个拦截器的主要目标是在执行增删改操作时,自动为数据模型对象的特定属性(如创建人、创建时间、修改人、修改时间等)赋值。 在MyBatis中,拦截器通过实现`Interceptor`接口来创建。`OpeInfoInterceptor`类就是...

    在3dMax中如何使用填充工具方法详解.docx

    在3D建模软件3ds Max中,填充工具是一个强大的功能,主要用于创建具有动画效果的虚拟人群场景。本文将详细讲解如何使用3ds Max的填充工具来构建动态、丰富的3D环境。 首先,填充工具主要包含三个核心组件:流、空闲...

    CAD填充图块历史大全

    - 修改填充:使用“对象特性”工具或“图块属性管理器”来调整图案的属性。 - 删除填充:选择填充图案,然后使用“删除”命令。 6. **CAD填充图案的组织** - 图案通常存储在库中,用户可以通过加载库文件(.pat...

    html对象属性大全

    从给定的HTML片段中,我们可以提取出一系列与HTML对象及其属性相关的知识点,这些知识点对于初学者理解HTML页面布局、元素样式以及交互性至关重要。以下是对这些知识点的详细解析: ### 1. `&lt;marquee&gt;` 标签 `...

    Android图片填充动画

    对于图片填充动画,属性动画通常是最合适的,因为它可以实时改变对象的属性,如宽度、高度或透明度,使动画效果更加流畅。 创建一个图片填充动画,我们首先要设计一个进度条图像,这个图像是由两部分组成的:一部分...

    WINCC中使用C 脚本和 VBS 改变对象颜色的解决方法.pdf

    在WinCC中,颜色显示是通过颜色方案和对象属性来控制的。颜色方案定义了界面的整体色调,而对象属性则决定了特定对象的颜色。通过脚本编程,我们可以改变这些设置,从而实现动态颜色变化。 **2. 要求** **2.1 禁用...

    CodeSmith的列对象的ExtendedProperty的属性

    根据给定的信息,“CodeSmith的列对象的ExtendedProperty的属性”,我们可以了解到这是一篇关于CodeSmith工具中如何处理数据库表的列属性的文章。CodeSmith是一款强大的代码生成工具,主要用于生成.NET项目的业务层...

    VB窗口属性中文对照表

    《VB窗口属性中文对照表》是一份面向初学者的重要资源,旨在帮助学习者理解和掌握Visual Basic (VB) 中与窗口相关的各种属性及其功能。这份对照表通过将英文属性名与其中文解释相对照的方式,使学习者能够更轻松地...

    Excel表格中鼠标单击后自动填充时间2.pdf

    4. 返回“Excel选项”,选择“个人信息选项”,取消勾选“保存时从文件属性中删除个人信息”。 5. 要打开“Visual Basic编辑器”,可以右键单击工作表标签(如“Sheet1”),选择“查看代码”,然后将上述相同代码...

    MATLAB绘制阴影柱状图(填充斜线)

    通过以上步骤,你就可以在MATLAB中创建一个具有阴影效果和斜线填充的柱状图了。这种方法可以帮助你更直观地展示和比较不同组之间的数据。在实际应用中,可以根据具体需求调整颜色、线条样式、线宽等参数,以达到最佳...

    地理信息系统基础:属性表编辑超图实践指导.pptx

    - **单个对象属性值的编辑**:直接在属性表窗口中或属性窗口中修改特定对象的特定属性值。 - **属性值的批量编辑**:适用于大量数据的快速更新,如统一赋值、单字段运算、双字段运算和函数运算。 - **统一赋值**...

    定时器:绘图对象,运行时间,坐标点

    总之,“定时器:绘图对象,运行时间,坐标点”是一个关于动态图形生成的综合概念,它涉及到软件编程中的时间控制、图形渲染和数学定位等多个技术层面。通过巧妙地结合这些知识点,开发者可以构建出各种创新的交互式...

    VB实现浏览查看文件属性

    这个小程序的主要功能是让用户能够选择一个文件,然后展示该文件的相关属性,包括但不限于文件名、大小、创建日期、修改日期以及访问时间等。下面将详细阐述实现这个功能的关键知识点。 首先,我们需要了解VB6.0的...

    BW之建模之信息对象

    在SAP的Business Warehouse (BW)环境中,建模是核心工作之一,而信息对象则是建模过程中的基本构建块。信息对象是BW中用于描述数据性质和价值的最小单位,它们构成了模型的基础结构,允许用户对R/3系统中的数据进行...

    CAD图块与图案填充作业.pptx

    4. **带属性的图块作业**:在提供的“CAD图块与图案填充作业.pptx”中,可能包含了使用带属性的图块来完成特定设计任务的练习,如绘制建筑平面图时插入带属性的门窗图块。 **图案填充(Hatching)** 图案填充则是...

    ADO.NET方法属性

    接下来,我们将详细介绍ADO.NET中的一些关键方法和属性,这些都是在实际开发中经常用到的技术点。 ##### 1. Connection 对象 - **属性**: - `ConnectionString`:用于指定连接数据库所需的参数,如服务器名、...

    EXCEL属性大全

    在Excel中,属性是控制工作簿、工作表、单元格以及其他元素特征的关键元素。对于初学者来说,了解Excel属性大全是非常有益...所以,对于初学者来说,投入时间学习Excel属性是值得的,它将开启你的数据处理和分析之旅。

    ZedGraph属性说明

    4. **Legend**:用于定义图例的位置、字体、颜色等属性,图例用于标识图表中的各个曲线。 5. **CurveItem**:抽象基类,是所有曲线的基础。包括`LineItem`、`BarItem`、`PieItem`等子类,它们分别代表折线图、柱状...

Global site tag (gtag.js) - Google Analytics