亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java注解之運(yùn)行時(shí)修改字段的注解值操作

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

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

導(dǎo)入Excel是用easypoi做的,識(shí)別表頭是用注解@Excel(name = "xxx")通過(guò)這個(gè)name來(lái)匹配

那你表頭要?jiǎng)?,我這個(gè)注解是硬編碼

所以就有動(dòng)態(tài)設(shè)置這個(gè)表頭

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是注解類(lèi)型
  if(excelAn == null){
   continue;
  }
  InvocationHandler h = Proxy.getInvocationHandler(excelAn);
  Field hField = h.getClass().getDeclaredField("memberValues");
    // 因?yàn)檫@個(gè)字段事 private final 修飾,所以要打開(kāi)權(quán)限
    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;
 }

補(bǔ)充知識(shí):java動(dòng)態(tài)修改 注解的值,控制對(duì)象轉(zhuǎn)化為json字符串的字段是否序列化

定義一個(gè)對(duì)象使用@JSONField控制該對(duì)象屬性是否需要序列化

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;
}

編寫(xiě)工具類(lèi)

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;

/**
 * 動(dòng)態(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;
  }
}

測(cè)試

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里面的注解看看效果,這個(gè)好像是發(fā)生了jvm優(yōu)化導(dǎo)致的問(wèn)題。。。

注釋第一個(gè)print 打印結(jié)果如下:

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

不注釋第一個(gè)print 打印結(jié)果如下:

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

接下來(lái)我們?cè)谧鲆粋€(gè)測(cè)試

  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));
  }

打印結(jié)果

[{"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"}]

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

以上這篇java注解之運(yùn)行時(shí)修改字段的注解值操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringCloud feign服務(wù)熔斷下的異常處理操作

    SpringCloud feign服務(wù)熔斷下的異常處理操作

    這篇文章主要介紹了SpringCloud feign服務(wù)熔斷下的異常處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • spring?kafka?@KafkaListener詳解與使用過(guò)程

    spring?kafka?@KafkaListener詳解與使用過(guò)程

    這篇文章主要介紹了spring-kafka?@KafkaListener詳解與使用,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java Builder模式實(shí)現(xiàn)原理及優(yōu)缺點(diǎn)解析

    Java Builder模式實(shí)現(xiàn)原理及優(yōu)缺點(diǎn)解析

    這篇文章主要介紹了Java Builder模式實(shí)現(xiàn)原理及優(yōu)缺點(diǎn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 用SpringBoot Admin監(jiān)控SpringBoot程序

    用SpringBoot Admin監(jiān)控SpringBoot程序

    這篇文章主要介紹了用SpringBoot Admin監(jiān)控SpringBoot程序,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • Mybatis模糊查詢和動(dòng)態(tài)sql語(yǔ)句的用法

    Mybatis模糊查詢和動(dòng)態(tài)sql語(yǔ)句的用法

    今天小編就為大家分享一篇關(guān)于Mybatis模糊查詢和動(dòng)態(tài)sql語(yǔ)句的用法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • springsecurity第三方授權(quán)認(rèn)證的項(xiàng)目實(shí)踐

    springsecurity第三方授權(quán)認(rèn)證的項(xiàng)目實(shí)踐

    Spring security 是一個(gè)強(qiáng)大的和高度可定制的身份驗(yàn)證和訪問(wèn)控制框架,本文主要介紹了springsecurity第三方授權(quán)認(rèn)證的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣可以了解一下
    2023-08-08
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(59)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(59)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-08-08
  • SpringBoot中緩存注解的使用詳解

    SpringBoot中緩存注解的使用詳解

    為了實(shí)現(xiàn)緩存,Spring?Boot?提供了一些緩存注解,可以方便地實(shí)現(xiàn)緩存功能,這篇文章主要介紹了SpringBoot中常用的緩存注解的使用方法,需要的可以參考一下
    2023-06-06
  • springboot 在ftl頁(yè)面上使用shiro標(biāo)簽的實(shí)例代碼

    springboot 在ftl頁(yè)面上使用shiro標(biāo)簽的實(shí)例代碼

    這篇文章主要介紹了springboot 在ftl頁(yè)面上使用shiro標(biāo)簽的實(shí)例代碼,通過(guò)文字說(shuō)明結(jié)合實(shí)例的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2018-05-05
  • Java高性能實(shí)體類(lèi)轉(zhuǎn)換工具M(jìn)apStruct的使用教程詳解

    Java高性能實(shí)體類(lèi)轉(zhuǎn)換工具M(jìn)apStruct的使用教程詳解

    MapStruct 是一個(gè)代碼生成器,它基于約定優(yōu)于配置的方法,極大地簡(jiǎn)化了 Java bean 類(lèi)型之間的映射實(shí)現(xiàn),本文主要介紹了MapStruct的具體使用以及如何進(jìn)行實(shí)體類(lèi)轉(zhuǎn)換,感興趣的可以了解下
    2024-03-03

最新評(píng)論