最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年08月22日 15:46:51   作者:藍色土耳其18  
這篇文章主要介紹了java注解之運行時修改字段的注解值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

所以就有動態(tài)設置這個表頭

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動態(tài)修改 注解的值,控制對象轉化為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;

/**
 * 動態(tài)操作注解屬性
 * @since 2020年8月13日20:49:26
 */
public class AnnotationUtils<T> {
  /**
   * 查看注解屬性
   * @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<A> 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里面的注解看看效果,這個好像是發(fā)生了jvm優(yōu)化導致的問題。。。

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

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

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

false
{"sad":"sadsad"}
true
{"sad":"sadsad"}

接下來我們在做一個測試

  public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    List<A> aList = new ArrayList<>();
    for(int i=0; i<10; i++){
      AnnotationUtils<A> 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"}]

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

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

相關文章

  • Spring Security 構建rest服務實現(xiàn)rememberme 記住我功能

    Spring Security 構建rest服務實現(xiàn)rememberme 記住我功能

    這篇文章主要介紹了Spring Security 構建rest服務實現(xiàn)rememberme 記住我功能,需要的朋友可以參考下
    2018-03-03
  • 解析spring cloud ouath2中的Eureka

    解析spring cloud ouath2中的Eureka

    這篇文章主要介紹了spring cloud ouath2中的Eureka,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 關于使用ContextClassLoader遇到的問題

    關于使用ContextClassLoader遇到的問題

    這篇文章主要介紹了關于使用ContextClassLoader遇到的問題,ContextClassLoader是通過Thread.currentThread().getContextClassLoader()返回該線程上下文的ClassLoader,需要的朋友可以參考下
    2023-10-10
  • Springboot啟動后執(zhí)行方法小結

    Springboot啟動后執(zhí)行方法小結

    本文主要介紹了Springboot啟動后執(zhí)行方法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 關于Gateway網關中配置跨域的三種方案

    關于Gateway網關中配置跨域的三種方案

    文章總結:介紹了三種處理跨域請求的方法:在Controller類上添加注解、通過配置類實現(xiàn)重寫WebMvcConfigurer接口和在配置文件中統(tǒng)一設置,希望這些方法能幫助讀者解決跨域問題
    2024-11-11
  • springboot枚舉類型傳遞的步驟

    springboot枚舉類型傳遞的步驟

    這篇文章主要介紹了springboot枚舉類型傳遞的步驟,幫助大家更好的理解和學習使用springboot,感興趣的朋友可以了解下
    2021-04-04
  • Java文件讀寫詳解

    Java文件讀寫詳解

    在真實的應用場景中,很多時候需要使用?Java?讀寫文件。比如說,讀取配置文件信息、讀取用戶輸入等。本篇文章將會詳細介紹?Java?文件讀寫的相關知識,其中包括:讀取文件、寫入文件、復制文件和刪除文件等操作,需要的朋友可以參考下
    2023-05-05
  • Java 垃圾回收機制詳解及實例代碼

    Java 垃圾回收機制詳解及實例代碼

    這篇文章主要介紹了 Java 垃圾回收機制詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-02-02
  • Java實現(xiàn)簡單GUI登錄和注冊界面

    Java實現(xiàn)簡單GUI登錄和注冊界面

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單GUI登錄和注冊界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • RestTemplate未使用線程池問題的解決方法

    RestTemplate未使用線程池問題的解決方法

    今天給大家?guī)淼氖顷P于Springboot的相關知識,文章圍繞著RestTemplate未使用線程池展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評論

武宣县| 扎鲁特旗| 陈巴尔虎旗| 西畴县| 门源| 三河市| 拉萨市| 南宁市| 福清市| 吉木乃县| 岐山县| 广汉市| 信丰县| 喀什市| 濉溪县| 车险| 永平县| 宁波市| 中卫市| 育儿| 秭归县| 罗平县| 平遥县| 江陵县| 临高县| 靖边县| 北票市| 宣城市| 崇阳县| 孝感市| 望谟县| 琼结县| 玉溪市| 盐津县| 田东县| 类乌齐县| 女性| 航空| 子长县| 吴堡县| 资源县|