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程式