1. 程式人生 > >java通過類的反射獲取頁面修改欄位前後值以及欄位名稱

java通過類的反射獲取頁面修改欄位前後值以及欄位名稱

   public void saveChangeVolue(Object before, Object after,String log) {
		StringBuffer alterContent=new StringBuffer();
		//before和after都不為空時  --屬性變化
		try {
			if (before != null && after != null) {
		    //獲取class位元組碼
			Class<?> classBefor = before.getClass();
			Class<?> classAfter = after.getClass();
			//獲取所有屬性
			Field[] fsBefor = classBefor.getDeclaredFields();
			Field[] fsAfter = classAfter.getDeclaredFields();
			//獲取類名
			String typeName = getClassName(after.getClass().getName());
			for (Field bField : fsBefor) {
				//設定物件中成員 屬性private為可讀
				bField.setAccessible(true);
				for (Field aField : fsAfter) {
					aField.setAccessible(true);
                    Id id = aField.getAnnotation(Id.class);
                    //臨時解決。後期再改。。
                    if(StringUtils.equals(bField.getName(),"serialVersionUID")){
                    	continue;
                    }
                    PropertyDescriptor bpd = new PropertyDescriptor(bField.getName(), classBefor);
					if (StringUtils.equals(bField.getName(), aField.getName()) && id == null) {
						// 獲得屬性值
						Method bmethod = bpd.getReadMethod();
						//構建一個屬性描述器 把對應屬性 propertyName 的 get 和 set 方法儲存到屬性描述器中  
						PropertyDescriptor apd = new PropertyDescriptor(aField.getName(), classAfter);
						//從屬性描述器中獲取 get 方法  
						Method amethod = apd.getReadMethod();
						// 獲得屬性型別
						if (bField.getGenericType().toString().equals("class java.lang.String")
								&& aField.getGenericType().toString().equals("class java.lang.String")) {
							// 比較物件前後的屬性值時候不相同
							if (!StringUtils.equals(((String) bmethod.invoke(before)),
									((String) amethod.invoke(after)))) {
								DataChangeRecord dto = new DataChangeRecord();
								// 判斷轉換前後值都為null或空時,不需要記錄變更資料
                                if(StringUtils.isNotBlank((String) bmethod.invoke(before))||StringUtils.isNotBlank((String) amethod.invoke(after))){
								//記錄到需要儲存的表中,如記錄表
                                        aField.getName()//欄位名
    								//修改的欄位
    								if (StringUtil.isNotEmpty(converMap.get(aField.getName()))) {
    									alterContent.append("編輯"+converMap.get(aField.getName())+','+(String) bmethod.invoke(before)+"為"+(String) amethod.invoke(after));
									}
    								
    								behaviorDto.setBehavDesc(alterContent.toString());
    								//dto.setOperateType(operateStatus);
    								dto.setDataId(behaviorDto.getDataId());
    								
    								dto.setParentDataId(behaviorDto.getFileEntityId());
    								dto.setChangeType("1");
    								dataChangeRecords.add(dto);
                                }
							}
						}else if(bField.getGenericType().toString().equals("class java.math.BigDecimal")){
							if (!StringUtils.equals(String.valueOf(bmethod.invoke(before)),
									String.valueOf(amethod.invoke(after)))) {
								// 判斷轉換前後值都為null或空時,不需要記錄變更資料
                                if(bmethod.invoke(before)!=null||amethod.invoke(after)!=null){
								/ /實體
                                	
                                	if(bmethod.invoke(before)!=null){
                                		dto.setBeforeUpdateValue(((BigDecimal)bmethod.invoke(before)).toPlainString());
                                		alterContent.append("編輯"+converMap.get(aField.getName())+','+((BigDecimal)bmethod.invoke(before)).toPlainString());
                                	}
                                	
                                	if (bmethod.invoke(before)!=null && amethod.invoke(after)!=null) {
										alterContent.append("為"+((BigDecimal)amethod.invoke(after)).toPlainString());
									}
    								//儲存資料到資料庫
    						       //TODO
                                }
								
							}
						} else {
							if (!StringUtils.equals(String.valueOf(bmethod.invoke(before)),
									String.valueOf(amethod.invoke(after)))) {
								// 判斷轉換前後值都為null或空時,不需要記錄變更資料
                                if(bmethod.invoke(before)!=null||amethod.invoke(after)!=null){
                                	DataChangeRecord dto = new DataChangeRecord();
                                	
                                	if(bmethod.invoke(before)!=null){
                                		dto.setBeforeUpdateValue(String.valueOf(bmethod.invoke(before)));
                                		//修改的欄位
                                		alterContent.append("編輯"+converMap.get(aField.getName())+','+String.valueOf(bmethod.invoke(before)));
                                	}
                                	if (bmethod.invoke(before)!=null && amethod.invoke(after)!=null) {
										alterContent.append("為"+String.valueOf(amethod.invoke(after)));
									}
    								
    								//儲存資料到資料庫
    						       //TODO
                                }
								
							}
						}
					}
				}
			}
		//before為null,after不為null  --新增
		} else if (after != null && before == null) {
			Class<?> classAfter = after.getClass();
			Field[] fsAfter = classAfter.getDeclaredFields();
			String typeName = getClassName(after.getClass().getName());
			for (Field aField : fsAfter) {
				aField.setAccessible(true);
				Id id = aField.getAnnotation(Id.class);
				PropertyDescriptor apd = new PropertyDescriptor(aField.getName(), classAfter);
				Method amethod = apd.getReadMethod();
				if (aField.getGenericType().toString().equals("class java.lang.String") && id == null) {
					// 判斷轉換前後值都為null或空時,不需要記錄變更資料
                    if(StringUtils.isNotBlank((String) amethod.invoke(after))){
                    	DataChangeRecord dto = new DataChangeRecord();
    					// 是否是字典屬性,是:儲存字典對應的名稱
    					dto.setAfterUpdateValue((String) amethod.invoke(after));
    					dto.setTableName(typeName);
    					dto.setColumnName(aField.getName());
    					//dto.setOperateType(operateStatus);
    					dto.setDataId(behaviorDto.getDataId());
    					dto.setParentDataId(behaviorDto.getFileEntityId());
    					dto.setChangeType("2");
    					dataChangeRecords.add(dto);
                    }
				}else if(aField.getGenericType().toString().equals("class java.math.BigDecimal") && id == null){
					// 判斷轉換前後值都為null或空時,不需要記錄變更資料
                    if(amethod.invoke(after)!=null){
						//儲存資料到資料庫
    						       //TODO
                    }
                   	
				} else if (id == null) {
					// 判斷轉換前後值都為null或空時,不需要記錄變更資料
                    if(StringUtils.isNotBlank(String.valueOf(amethod.invoke(after)))){
						//儲存資料到資料庫
    						       //TODO
                    }
				}
			}
		//before不為null,after為null --刪除
		} else if (after == null && before != null) {
			Class<?> classBefore = before.getClass();
			Field[] fsBefore = classBefore.getDeclaredFields();
			String typeName = getClassName(before.getClass().getName());
			for (Field bField : fsBefore) {
				bField.setAccessible(true);
				Id id = bField.getAnnotation(Id.class);
				PropertyDescriptor bpd = new PropertyDescriptor(bField.getName(), classBefore);
				Method bmethod = bpd.getReadMethod();
				if (bField.getGenericType().toString().equals("class java.lang.String") && id == null) {
					if(StringUtils.isNotBlank((String) bmethod.invoke(before))){
					
						//儲存資料到資料庫
    						       //TODO
					}
				}else if(bField.getGenericType().toString().equals("class java.math.BigDecimal") && id == null){
					// 判斷轉換前後值都為null或空時,不需要記錄變更資料
                    if(bmethod.invoke(before)!=null){
						//儲存資料到資料庫
    						       //TODO
                    }
				} else if (id == null) {
					// 判斷轉換前後值都為null或空時,不需要記錄變更資料
                    if(StringUtils.isNotBlank(String.valueOf(bmethod.invoke(before)))){
						//儲存資料到資料庫
    						       //TODO
                    }
				}
			}
		}
		} catch (Exception e) {
			e.printStackTrace();
		}
		/**
		 * 插入資料庫操作
		 */

	if(dataChangeRecords.size()>0){
		Field afterField=null;
		Field beforeField=null;
	 try{
			afterField = after.getClass().getDeclaredField("objectid");
		    afterField.setAccessible(true);
			beforeField=before.getClass().getDeclaredField("objectid");
	        beforeField.setAccessible(true);

		if(StringUtils.equals(afterField.get(after).toString(), beforeField.get(before).toString())){
			 insertBehavior(behaviorDto,userInfo);
		}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	
	
	}
	
}

相關推薦

java通過反射獲取頁面修改前後以及名稱

public void saveChangeVolue(Object before, Object after,String log) { StringBuffer alterContent=new StringBuffer(); //before和after

java中使用反射獲取pojo(實體)的所有

 說起反射,不得不說它實在是太強大了,通過反射就可以輕輕鬆鬆拿到各種東東,如果你想在專案中解除對某個類的依賴,可以考慮用反射。        今天跟大家分享的是通過java中的反射,獲取pojo類的所有欄位值。 &nb

Java中使用反射獲取一個的全部資訊

public static void getFunctionAllMessages(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessExcept

Angular 通過注入 $location 獲取修改當前頁面URL

以下獲取與修改的 URL 以  ( http://172.16.0.88:8100/#/homePage?id=10&a=100  ) 為例 【一】獲取 (不修改URL) //

封裝一個通過獲取對象的函數

技術分享 由於 ges http 技術 通過 ie9 element html dom 由於HTML DOM 的getElementsByClassName()不兼容ie9以下瀏覽器,所以需要封裝一個通過類名獲取對象的函數getElementsByClass()。參數cla

php利用simple_html_dom獲取頁面內容,充當爬蟲角色

contents names mac tro upd tool one mit 一個 PHP腳本扮演爬蟲的角色,可能大家第一時間想到可能會是會正則,個人對正則的規則老是記不住,表示比較難下手,今天工作中有個需求需要爬取某個網站上的一些門店信息 無意間在網上看到一個比較好的

C# 通過url地址獲取頁面內容

pre .html res htm 頁面 ons light ebr dto using System.Net; using System.IO; HttpWebRequest request = (HttpWebRequest)WebRequest

Hibernate Dao映射配置通用接口反射獲取加載calass實例

emp pda package cti nbsp from pes framework .get 接口:package com.ph.dao;import java.io.Serializable;import java.util.List;import org.hiber

SpringBoot 入門之二:獲取Properties中的通過配置來替代原SpringXML的配和注入方式

•application.properties •application.yml person.last-name=\u674E\u56DB person.age=12 person.birth=2017/12/15 person.boss=false person.maps.k

整理收集的一些常用java工具獲取異常堆疊資訊)

轉:https://blog.csdn.net/qq_22075041/article/details/77431915   1.json轉換工具 package com.taotao.utils;   import java.util.List;   im

java Scanner 獲取鍵盤的輸入

Scanner 類是什麼? 用來獲取鍵盤的輸入 使用Scanner 好 Random 類來製作簡單的猜字小遊戲 import java.util.Random; import java.util.Scanner; public class ScannerDemo01 { public

java:File(練習)--獲取某個目錄下的所有某種型別的檔案

需求:從鍵盤輸入接收一個資料夾路徑,打印出該資料夾下所有的.java檔名  package com.heima.chario; import java.io.File; import java.ut

UIWebView與javascript互動二通過頁面的響應事件獲取頁面輸入框內的

接上篇文章,上篇文章實現了UIwebview對html檔案的載入和對js事件的響應,但是對html頁面上輸入的值沒有獲取。 今天就來說說這個首先要用到工具類WebViewJavascriptBridge 下載地址 然後將工具類匯入到專案中。 其中te

DOM操作通過獲取元素

<span style="font-family:Microsoft YaHei;font-size:18px;">clsname是要獲取元素的類名,parentId是要獲取父元素id</span><span style="font-famil

Java通過銀行卡號獲取卡屬銀行(含校驗)

注:百度所得,更新了資料 public class GetBank { /** * @param args * @throws SQLException */ private final static int[] bankBin = {

java通過身份證號碼獲取出生日期、性別、年齡

身份證號碼: 15位:6位地址碼+6位出生年月日(900101代表1990年1月1日出生)+3位順序碼 18位:6位地址碼+8位出生年月日(19900101代表1990年1月1日出生)+3位順序碼+1位校驗碼 地區碼: 1、 第一、二位表示省(自治區、直

java反射獲取物件的屬性及屬性

public class InitializeProperty { public static void setEmpty(Object obj) { try { // 獲取實體類的所有屬性,返回Field陣列 Field[] field = obj.

自定義通過獲取元素的函式

定義函式getByClass()實現獲取document或指定父元素下所有class為on的元素,要求該函式可以接收一個引數也可以接收兩個引數:第一個引數為必需的,第二個引數為可選的;第一個引數為要獲取的元素的類名,第二個引數如果傳,則傳父元素的id,不傳則預設用docume

java集合HashMap獲取鍵和

1.獲取HashMap鍵 package com.mypractice.third; import java.util.HashMap; import java.util.Map; import

java之 ------ 反射【詳解】

一、什麼是類反射 ★JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動 態調用物件的方法的功能稱為Java語言的反射機制。 反射(Reflection)是Java程式