java只修改變的字段_java注解之運行時修改字段的注解值操作

今天遇到需求:導入Excel時候列頭會發生變化,客戶是大爺要求你改代碼,

導入Excel是用easypoi做的,識別表頭是用注解@Excel(name = "xxx")通過這個name來匹配

那你表頭要動,我這個注解是硬編碼

所以就有動態設置這個表頭

public class JavaVo{

@Excel(name = "xxx")

private String userName;

//省略getset方法

}

ExcelImportUtil.importExcel(file.getInputStream(), configClass(JavaVo.class), params);

代碼如下

private Class configClass(Class c , String val) {

Field[] fields = c.getDeclaredFields();

try {

for(int i = 0;i < fields.length;i++){

Field f = fields[i];

Excel excelAn = f.getAnnotation(Excel.class);//Excel是注解類型

if(excelAn == null){

continue;

}

InvocationHandler h = Proxy.getInvocationHandler(excelAn);

Field hField = h.getClass().getDeclaredField("memberValues");

// 因為這個字段事 private final 修飾,所以要打開權限

hField.setAccessible(true);

// 獲取 memberValues

Map memberValues = (Map) hField.get(h);

// 修改 value 屬性值 這里修改的是@Excel(name = "姓名")

//name是key

memberValues.put("name", val);

}

} catch (Exception e) {

e.printStackTrace();

}

return c;

}

補充知識:java動態修改 注解的值,控制對象轉化為json字符串的字段是否序列化

定義一個對象使用@JSONField控制該對象屬性是否需要序列化

import com.alibaba.fastjson.annotation.JSONField;

import lombok.Data;

@Data

public class A {

@JSONField(serialize = false)

private String extendParams;

@JSONField(serialize = true)

private String sad;

}

編寫工具類

import com.alibaba.fastjson.annotation.JSONField;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

import java.util.Map;

import lombok.val;

/**

* 動態操作注解屬性

* @since 2020年8月13日20:49:26

*/

public class AnnotationUtils {

/**

* 查看注解屬性

* @param t

* @param name

* @return

* @throws NoSuchFieldException

*/

public Object getJSONFieldProp(T t, String name) throws NoSuchFieldException {

Field field = t.getClass().getDeclaredField(name);

JSONField annotation = field.getAnnotation(JSONField.class);

val serialize = annotation.serialize();

return serialize;

}

/**

* 修改注解屬性

* @param t

* @param value

* @return

* @throws NoSuchFieldException

* @throws IllegalAccessException

*/

public Object setJSONFieldProp(T t,String name, Object value) throws NoSuchFieldException, IllegalAccessException {

Field field = t.getClass().getDeclaredField(name);

JSONField annotation = field.getAnnotation(JSONField.class);

InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);

Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");

memberValues.setAccessible(true);

Map map = (Map) memberValues.get(invocationHandler);

map.put("serialize",value);

val serialize = annotation.serialize();

return serialize;

}

}

測試

import com.alibaba.fastjson.JSON;

public class TT {

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

AnnotationUtils aAnnotationUtils = new AnnotationUtils<>();

A a = new A();

a.setExtendParams("exex");

a.setSad("sadsad");

Object extendParams = aAnnotationUtils.getJSONFieldProp(a, "extendParams");//查詢注解的值

System.out.println(extendParams.toString());

// System.out.println(JSON.toJSONString(a));

Object extendParams1 = aAnnotationUtils.setJSONFieldProp(a, "extendParams", true);//修改注解的值

System.out.println(extendParams1.toString());

System.out.println(JSON.toJSONString(a));

}

}

去掉main里面的注解看看效果,這個好像是發生了jvm優化導致的問題。。。

注釋第一個print 打印結果如下:

false

true

{"extendParams":"exex","sad":"sadsad"}

不注釋第一個print 打印結果如下:

false

{"sad":"sadsad"}

true

{"sad":"sadsad"}

接下來我們在做一個測試

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

List aList = new ArrayList<>();

for(int i=0; i<10; i++){

AnnotationUtils aAnnotationUtils = new AnnotationUtils<>();

A a = new A();

a.setExtendParams("exex");

a.setSad("sadsad");

if(i%2 == 0) {

aAnnotationUtils.setJSONFieldProp(a, "extendParams", true);//修改注解的值

}

aList.add(a);

}

System.out.println(JSON.toJSONString(aList));

}

打印結果

[{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"}]

我本想用修改注解的方式來修改某個字段的序列化與不序列化,但是我發現注解是在class層面的并不是在對象層面。所以我的設想失敗了。。

以上這篇java注解之運行時修改字段的注解值操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持聚米學院。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529979.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

求java簡單計算器源代碼_java簡單計算器源代碼

簡單計算器代碼package calcultorthree;import java.awt.BorderLayout;//導入邊界布局管理器類import java.awt.GridLayout;//導入網格布局管理器類import java.awt.TextField;//導入文本區域類import java.awt.event.ActionEvent;//導入事件類import java.awt.event.ActionLis…

java中間語言匯編語言_中間語言(IL) | 學步園

一、IL與匯編語言IL是微軟.NET平臺上衍生出的一門中間語言&#xff0c;.NET平臺上的各種高級語言(如C#&#xff0c;VB&#xff0c;F#)的編譯器會將各自的代碼轉化為IL。&#xff0c;其中包含了.NET平臺上的各種元素&#xff0c;如“范型”&#xff0c;“類”、、“接口”、“模…

java遍歷斐波納契數列_詳解循環、迭代、遞歸、分治(Leet Code 509 斐波那契數列),實際運用...

Multiple solutions of Fibonacci (Python or Java)本章是用英文寫的&#xff0c;作為或想成為一名優秀的攻城獅&#xff0c;習慣閱讀英文文檔將使你受益良多。例如更好的查看最新版的官方文檔、與國外友人交流、等等 其實英文的生詞也并不多,其中90&#xff05;的英文都在代碼…

java棧內存是先進后出嗎_java堆內存與棧內存區別

棧(stack):是一個先進后出的數據結構,通常用于保存方法(函數)中的參數,局部變量. 在java中,所有基本類型和引用類型都在棧中存儲.棧中數據的生存空間一般在當前scopes內(就是由{...}括起來的區域).棧的優勢是&#xff0c;存取速度比堆要快&#xff0c;僅次于直接位于CPU中的寄存…

主頁面功能的java_6-04-項目實戰-主頁面顯示當前用戶退出功能實現

教程列表&#xff1a;1-01-servlet學習-HTTP協議的概念作用和特點1-02-servlet學習-HTTP協議的交互流程和請求格式和請求方式1-03-servlet學習-HTTP協議的響應格式和常見狀態碼1-04-servlet學習-服務器介紹&tomcat服務器的安裝和驗證1-05-servlet學習-第一個web項目1-06-se…

java 二分查找 排序_java 冒泡排序 二分查找

下面這個程序是先定義一個整型數組&#xff0c;然后將其中的元素反序賦值&#xff0c;再用冒泡排序進行排序以后用二分查找來查找其中是否有某個數&#xff0c;返回值為-1時表示這個數可能小于這個數組的最小值或大小這個數組的最大值&#xff0c;-2表示這個數比這個數組的最小…

php 數組設置為空,PHP數組設置空值

如果沒有數據存在&#xff0c;如何將數組值設置為null&#xff1f;PHP數組設置空值以下是我的PHP陣列和我JSON編碼 -{"title":"Impalz-Marketing","type":"Business Details","version":"1.0","login":…

什么是寫一個java類,Java什么是類?class的相關介紹

本章給大家帶來Java什么是類&#xff1f;class的相關介紹&#xff0c;讓大家了解關于類(class)的一些知識。有一定的參考價值&#xff0c;有需要的朋友可以參考一下&#xff0c;希望對你有所幫助。class Point{constructor(){}toString(){}}console.log(Object.keys(Point.prot…

windows php sqlite,如何在Apache 2.4(Windows 7)上為PHP 5.6.14配置SQLite3?

我在Windows 7上,在Apache 2.4上使用PHP 5.6.14版,我正在嘗試訪問SQLite3數據庫.我正在……致命錯誤&#xff1a;找不到類“SQLite3”在這里你是一個簡單的PHP代碼…$db new SQLite3(phpdb);if ($db) {$db->query("CREATE TABLE dogbreeds (Name VARCHAR(255), MaxAge…

php 國密 簽名,關于php國密SM3簽名算法

推薦&#xff1a;《PHP視頻教程》php國密SM3簽名算法代碼地址github.com/lizhichao/sm安裝composer require lizhichao/one-sm使用require __DIR__ . /vendor/autoload.php; // 字符串簽名 echo OneSmSm3::sign(abc) . PHP_EOL; echo OneSmSm3::sign(str_repeat("adfas哈哈…

matlab狀態方程 傳遞函數 可控性,實驗一matlab系統的傳遞函數和狀態空間表達式的轉換...

實驗一 MATLAB 系統的傳遞函數和狀態空間表達式的轉換一、 實驗目的1、學習多變量系統狀態空間表達式的建立方法&#xff1b;2、通過編程、上機調試&#xff0c;掌握多變量系統狀態空間表達式與傳遞函數之間相互轉換的方法&#xff1b;3、掌握相應的MATLAB 函數。二、 實驗原理…

php里h和h的區別嗎,編碼h264h和h264b有什么區別

區別如下&#xff1a;1、版本H.265是新的編碼協議&#xff0c;也即是H.264的升級版。H.265標準保留H.264原來的某些技術&#xff0c;同時對一些相關的技術加以改進。新技術使用先進的技術用以改善碼流、編碼質量、延時和算法復雜度之間的關系&#xff0c;達到最優化設置。2、儲…

mysql5.1怎么備份,MySQL 5.1升級到MySQL 5.5的步驟

mysql 5.5已經出來有一段時間&#xff0c;性能有明顯提升&#xff0c;特別是對多核CPU的支持與TPS性能的提升。上周博主介紹了linux下編譯安裝mysql 5.5的步驟&#xff0c;安裝不出意外基本沒有問題。不過可能很多朋友和我一樣一直用的是mysql 5.1&#xff0c;現在想把數據庫升…

php file del 方法,php怎么遍歷文件刪除指定字符

php遍歷文件刪除指定字符的實現方法&#xff1a;首先創建一個PHP示例文件&#xff1b;然后通過“function del($getstr){…}”方法刪除指定目錄下所有指定文件中指定字符串即可。本文操作環境&#xff1a;windows7系統、PHP7.1版&#xff0c;DELL G3電腦php實現遍歷目錄并刪除指…

event類型 php,深入解析PHP的Laravel框架中的event事件操作

有時候當我們單純的看 Laravel 手冊的時候會有一些疑惑&#xff0c;比如說系統服務下的授權和事件&#xff0c;這些功能服務的應用場景是什么&#xff0c;其實如果沒有經歷過一定的開發經驗有這些疑惑是很正常的事情&#xff0c;但是當我們在工作中多加思考會發現有時候這些服務…

php 抽象類 靜態方法嗎,php中的抽象類和靜態方法是什么

php中的抽象類是指&#xff1a;在class前加了abstract關鍵字且存在抽象方法的類&#xff0c;它不能被直接實例化&#xff1b;靜態方法是指&#xff1a;被static關鍵字修飾的方法&#xff0c;靜態方法用于操作靜態屬性。抽象類抽象類是指在 class 前加了 abstract 關鍵字且存在抽…

python目錄結構生成庫,使用CMake構建平臺無關的目錄結構

我試圖為我的跨平臺項目創建一個目錄結構&#xff0c;但遇到了一些問題。我已經讓CMake確定了放置庫和可執行文件的適當位置&#xff0c;但這種結構僅適用于Windows。在我的結構如下所示&#xff1a;項目目錄垃圾箱可執行文件圖書館圖書館Python增壓模塊python腳本這在Windows上…

centos 怎樣下載php,centos下怎樣安裝軟件

centos下安裝軟件的方法是&#xff1a;centos安裝軟件的命令1、rpm包的安裝1.安裝一個包# rpm -ivh2.升級一個包# rpm -Uvh3.移走一個包# rpm -e4.安裝參數--force 即使覆蓋屬于其它包的文件也強迫安裝--nodeps 如果該RPM包的安裝依賴其它包&#xff0c;即使其它包沒裝&#xf…

php fpm 安裝配置,php php+fpm安裝配置

sudo apt - get install php5 - cgi php5 - mysql php5 - fpm php5 - curl php5 - gd php5 - idn php - pear php5 - imagick php5 - imap php5 - mcrypt php5 - mhash php5 - ming php5 - pspell php5 - recode php5 - snmp php5 - tidy php5 - xmlrpc php5 - xsl打開 /etc/ph…

php post 微信沙箱,微信支付平臺錯誤:獲取沙箱密鑰失敗,確保交易密鑰是

按官方提示進行獲取沙箱密鑰的時候&#xff0c;久試不爽&#xff0c;總是提示錯誤 &#xff1a;“獲取沙箱密鑰失敗&#xff0c;確保交易密鑰是否正確”。這個純粹是微信平臺挖的坑呀&#xff0c;文檔沒有詳細的進行一些講解&#xff0c;也沒有提示需要key&#xff0c;下面來說…