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.mzph.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;下面来说…