填充对象中的时间属性

简介:

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

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

解决方法:使用反射

 

Java代码   收藏代码
  1. /*** 
  2.      * 把对象中的列,类型为时间的都设置为当前时间 
  3.      * @param obj 
  4.      * @throws SecurityException 
  5.      * @throws NoSuchFieldException 
  6.      * @throws IllegalArgumentException 
  7.      * @throws IllegalAccessException 
  8.      */  
  9.     public static void fillTimeForObj(Object obj) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{  
  10.         List<Field> fieldsList=getAllFieldList(obj.getClass());  
  11.         int size=fieldsList.size();  
  12.         for(int i=0;i<size;i++){  
  13.             Field f=fieldsList.get(i);  
  14.             String typeName=f.getType().getName();  
  15.             if(typeName.equals("java.sql.Timestamp")||typeName.equals("java.util.Date")){  
  16.                 setObjectValue(obj, f, TimeHWUtil.getCurrentTimestamp());  
  17.             }else if(typeName.equals("java.sql.Date")){  
  18.                 setObjectValue(obj, f, new java.util.Date());  
  19.             }  
  20.         }  
  21.     }  

 依赖的方法:

 

 

Java代码   收藏代码
  1. /*** 
  2.      * get all field ,including fields in father/super class 
  3.      *  
  4.      * @param clazz 
  5.      * @return 
  6.      */  
  7.     public static List<Field> getAllFieldList(Class<?> clazz) {  
  8.         List<Field> fieldsList = new ArrayList<Field>();// return object  
  9.         if (clazz == null) {  
  10.             return null;  
  11.         }  
  12.   
  13.         Class<?> superClass = clazz.getSuperclass();// father class  
  14.         if (!superClass.getName().equals(Object.class.getName()))/* 
  15.                                                                  * java.lang.Object 
  16.                                                                  */{  
  17.   
  18.             // System.out.println("has father");  
  19.             fieldsList.addAll(getAllFieldList(superClass));// Recursive  
  20.         }  
  21.         Field[] fields = clazz.getDeclaredFields();  
  22.         for (int i = 0; i < fields.length; i++) {  
  23.             Field field = fields[i];  
  24.             // 排除因实现Serializable 接口而产生的属性serialVersionUID  
  25.             if (!field.getName().equals("serialVersionUID")) {  
  26.                 fieldsList.add(field);  
  27.             }  
  28.         }  
  29.         return fieldsList;  
  30.     }  
  31. /*** 
  32.      * 设置对象的属性值。 
  33.      *  
  34.      * @param obj 
  35.      * @param propertyName 
  36.      *            : property name 
  37.      * @param propertyValue 
  38.      *            : value of property<br> must be String or Field 
  39.      * @throws SecurityException 
  40.      * @throws NoSuchFieldException 
  41.      * @throws IllegalArgumentException 
  42.      * @throws IllegalAccessException 
  43.      */  
  44.     public static void setObjectValue(Object obj, Object propertyName,  
  45.             Object propertyValue) throws SecurityException,  
  46.             NoSuchFieldException, IllegalArgumentException,  
  47.             IllegalAccessException {  
  48.         if (ValueWidget.isNullOrEmpty(propertyName)  
  49.                 || ValueWidget.isNullOrEmpty (propertyValue)) {  
  50.             return;  
  51.         }  
  52.         Class<?> clazz = obj.getClass();  
  53.         Field name = null;  
  54.         if(propertyName instanceof String){  
  55.         name=getSpecifiedField(clazz, (String)propertyName);  
  56.         }else{  
  57.             name=(Field)propertyName;  
  58.         }  
  59.         name.setAccessible(true);  
  60.         name.set(obj, propertyValue);  
  61.   
  62.     }  
  63. /*** 
  64.      * Get Specified Field 
  65.      *  
  66.      * @param clazz 
  67.      * @param fieldName 
  68.      * @return 
  69.      */  
  70.     public static Field getSpecifiedField(Class<?> clazz, String fieldName) {  
  71.         Field f = null;  
  72.         if (ValueWidget.isNullOrEmpty(clazz)) {  
  73.             return null;  
  74.         }  
  75.         try {  
  76.             f = clazz.getDeclaredField(fieldName);  
  77.         } catch (NoSuchFieldException e) {  
  78.             return getSpecifiedField(clazz.getSuperclass()/* 
  79.                                                          * may be null if it is 
  80.                                                          * Object . 
  81.                                                          */, fieldName);  
  82.             // e.printStackTrace();  
  83.         }  
  84.         return f;  
  85.     }  

 

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

Java代码   收藏代码
  1. /*** 
  2.      * 使用spring MVC保存对象时,对象的createTime(时间类型的属性)没有注入进来, 
  3.      * <br>这时需要后台先通过id获取持久化对象,然后手动注入 
  4.      * @param editedObj 
  5.      * @param persistentObj 
  6.      * @throws SecurityException 
  7.      * @throws NoSuchFieldException 
  8.      * @throws IllegalArgumentException 
  9.      * @throws IllegalAccessException 
  10.      */  
  11.     public static void fillTimeForEditedObj(Object editedObj,Object persistentObj) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{  
  12.         if(!editedObj.getClass().getName().equals(persistentObj.getClass().getName())){  
  13.             throw new RuntimeException("Two object type should be the same ,but is different .");  
  14.         }  
  15.         List<Field> fieldsList=getAllFieldList(editedObj.getClass());  
  16.         int size=fieldsList.size();  
  17.         for(int i=0;i<size;i++){  
  18.             Field f=fieldsList.get(i);  
  19.             String typeName=f.getType().getName();  
  20.             if(editedObj instanceof java.util.Date || typeName.equals("java.sql.Timestamp")||typeName.equals("java.util.Date")||typeName.equals("java.sql.Date")){  
  21.                 Object valueEdited=getObjectValue(editedObj, f);  
  22.                 Object valuePersistent=getObjectValue(persistentObj, f);  
  23.                 if(ValueWidget.isNullOrEmpty(valueEdited)&&(!ValueWidget.isNullOrEmpty(valuePersistent))){  
  24.                     setObjectValue(editedObj, f, valuePersistent);  
  25.                 }  
  26.                   
  27.             }  
  28.         }  
  29.     }  

 参考:

Java 反射常用方法

相关文章
|
2月前
超标记<a>都有哪些属性
【8月更文挑战第30天】超标记<a>都有哪些属性。
22 3
|
5月前
|
测试技术
反射获取或修改对象属性的值
* 获取单个对象的所有键值对
46 3
|
5月前
|
XML JSON 移动开发
BpmnJS 元素属性的updateProperties 和updateModdleProperties的属性更新区别
BpmnJS 元素属性的updateProperties 和updateModdleProperties的属性更新区别
150 1
对象的属性和值转换
对象的属性和值转换
37 0
126.设置填充类型和填充颜色
126.设置填充类型和填充颜色
84 0
|
开发者 索引
Javscript数组快速填充数据的8种方法
Javscript数组快速填充数据的8种方法
214 0
|
C++
VS 显示方法引用的设置方法
VS 中Codelens的设置面板没有相关的设置项?那如何调整出方法的引用呢?
2191 0
VS 显示方法引用的设置方法
把两个object对象合并成一个对象 属性名称相同的变为后面对象的值
把两个object对象合并成一个对象 属性名称相同的变为后面对象的值
1033 0
|
SQL 关系型数据库 流计算