返回顶部
首页 > 资讯 > 精选 >怎样动态修改JavaBean中注解的参数值
  • 124
分享到

怎样动态修改JavaBean中注解的参数值

2023-06-06 11:06:00 124人浏览 八月长安
摘要

小编给大家分享一下怎样动态修改JavaBean中注解的参数值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我这里有一个需求需要修改Person类中的一个属性上的注

小编给大家分享一下怎样动态修改JavaBean中注解的参数值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

我这里有一个需求需要修改Person类中的一个属性上的注解的值进行修改,例如:

public class Person { private int age; @apiParam(access="lala") private String name; //get set 方法忽略 }

将@ApiParam(access=“lala”) 修改为@ApiParam(access=“fafa”),经过分析是可以实现的,需要用到动态代理进行操作。

具体源码如下所示:

@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface ApiParam { String access() default "";}

反射+动态代理代码如下:

public class TestClazz { public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {  Person person = new Person(); Field value = person.getClass().getDeclaredField("name"); value.setAccessible(true); //APIParam 是一个自定义的注解 ApiParam apiParam = (ApiParam) value.getAnnotation(ApiParam.class); java.lang.reflect.InvocationHandler invocationHandler = Proxy.getInvocationHandler(apiParam); Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues"); //通过反射获取memberValues 这个属性是Map类型 存放着所有的属性。  memberValues.setAccessible(true);  Map<String, Object> values = (Map<String, Object>) memberValues.get(invocationHandler);  String val = (String) values.get("access"); System.out.println("------改之前:"+val); values.put("access", "fafa");//修改属性 System.out.println("-----------------"); //Field value1 = person.getClass().getDeclaredField("name"); value.setAccessible(true); ApiParam apiParam1 = (ApiParam) value.getAnnotation(ApiParam.class); System.out.println("------改之后:"+apiParam1.access()); //动态代理的方式不会改变原先class文件的内容 }}

补充:Java自定义注解并实现注解的伪动态参数传递

自定义注解,实现记录接口的调用日志,此注解可以实现传递伪动态参数。

一、需要引入的jar包:

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-WEB</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency><!-- test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency><!-- JSON --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> </dependency> </dependencies>

二、自定义注解:

package com.example.demo.annotation; import java.lang.annotation.*; @Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ApiOperationLog { String resourceId() default ""; String operationType(); String description() default "";}

三、定义切面:

package com.example.demo.aspect; import com.example.demo.annotation.ApiOperationLog;import net.sf.json.JSONObject;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.stereotype.Component; import java.util.HashMap;import java.util.Map; @Aspect@Componentpublic class ApiOperationAspect {  @Pointcut("@annotation ( com.example.demo.annotation.ApiOperationLog)") public void apiLog() { }  @AfterReturning(pointcut = "apiLog()") public void recordLog(JoinPoint joinPoint) {  MethodSignature signature = (MethodSignature) joinPoint.getSignature();  // 获取方法上的指定注解  ApiOperationLog annotation = signature.getMethod().getAnnotation(ApiOperationLog.class);  // 获取注解中的参数  String resourceId = getAnnotationValue(joinPoint, annotation.resourceId());  String operationType = getAnnotationValue(joinPoint, annotation.operationType());  String description = getAnnotationValue(joinPoint, annotation.description());  System.out.println("resourceId:" + resourceId);  System.out.println("operationType:" + operationType);  System.out.println("description:" + description);  // 将注解中测参数值保存到数据库,实现记录接口调用日志的功能(以下内容省略...)  }   public String getAnnotationValue(JoinPoint joinPoint, String name) {  String paramName = name;  // 获取方法中所有的参数  Map<String, Object> params = getParams(joinPoint);  // 参数是否是动态的:#{paramName}  if (paramName.matches("^#\\{\\D*\\}")) {   // 获取参数名   paramName = paramName.replace("#{", "").replace("}", "");   // 是否是复杂的参数类型:对象.参数名   if (paramName.contains(".")) {    String[] split = paramName.split("\\.");    // 获取方法中对象的内容    Object object = getValue(params, split[0]);    // 转换为JsonObject    JSONObject jsonObject = JSONObject.fromObject(object);    // 获取值    Object o = jsonObject.get(split[1]);    return String.valueOf(o);   }   // 简单的动态参数直接返回   return String.valueOf(getValue(params, paramName));  }  // 非动态参数直接返回  return name; }   public Object getValue(Map<String, Object> map, String paramName) {  for (Map.Entry<String, Object> entry : map.entrySet()) {   if (entry.geTKEy().equals(paramName)) {    return entry.getValue();   }  }  return null; }   public Map<String, Object> getParams(JoinPoint joinPoint) {  Map<String, Object> params = new HashMap<>(8);  Object[] args = joinPoint.getArgs();  MethodSignature signature = (MethodSignature) joinPoint.getSignature();  String[] names = signature.getParameterNames();  for (int i = 0; i < args.length; i++) {   params.put(names[i], args[i]);  }  return params; } }

四:测试前的准备内容:

// 实体类package com.example.demo.model; public class User {  private Long id; private String name; private int age;  public Long getId() {  return id; }  public void setId(Long id) {  this.id = id; }  public String getName() {  return name; }  public void setName(String name) {  this.name = name; }  public int getAge() {  return age; }  public void setAge(int age) {  this.age = age; }  @Override public String toString() {  return "User{" +    "id=" + id +    ", name='" + name + '\'' +    ", age=" + age +    '}'; }}  // controller层内容package com.example.demo.controller; import com.example.demo.annotation.ApiOperationLog;import com.example.demo.model.User;import org.springframework.web.bind.annotation.RestController; @RestControllerpublic class LoginController {  @ApiOperationLog(resourceId = "#{user.id}",operationType = "SAVE",description = "测试注解传递复杂动态参数") public void saveUser(User user,String id){  System.out.println("测试注解..."); }  @ApiOperationLog(resourceId = "#{id}",operationType = "UPDATE",description = "测试注解传递简单动态参数") public void updateUser(User user,String id){  System.out.println("测试注解..."); } }

五、测试类:

package com.example.demo.aspect; import com.example.demo.DemoApplication;import com.example.demo.controller.LoginController;import com.example.demo.model.User;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = DemoApplication.class)public class ControllerTest {  @Autowired private LoginController loginController;  @Test public void test(){  User user = new User();  user.setId(1L);  user.setName("test");  user.setAge(20);  loginController.saveUser(user,"123");  loginController.updateUser(user,"666"); }}

测试结果:

测试注解...resourceId:1operationType:SAVEdescription:测试注解传递复杂动态参数测试注解...resourceId:666operationType:UPDATEdescription:测试注解传递简单动态参数

以上是“怎样动态修改JavaBean中注解的参数值”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 怎样动态修改JavaBean中注解的参数值

本文链接: https://lsjlt.com/news/246393.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎样动态修改JavaBean中注解的参数值
    小编给大家分享一下怎样动态修改JavaBean中注解的参数值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我这里有一个需求需要修改Person类中的一个属性上的注...
    99+
    2023-06-06
  • java怎么动态修改注解的值
    在Java中,注解的值通常是在编译时确定的,因此在运行时动态修改注解的值是不容易实现的。但是,可以通过使用反射来实现动态修改注解的值...
    99+
    2023-09-26
    java
  • 怎么判断和修改SQL中的动态参数与静态参数
    本篇内容主要讲解“怎么判断和修改SQL中的动态参数与静态参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么判断和修改SQL中的动态参数与静态参数”吧!视图 ...
    99+
    2024-04-02
  • 使用Spring怎么动态修改时间参数
    使用Spring怎么动态修改时间参数?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。spring实现定时任务的方式有三种,分别是java自带的timer类、spring task...
    99+
    2023-05-31
    spring
  • java怎么修改注解的值
    要修改注解的值,可以使用反射来获取注解的信息,并通过反射修改注解的属性值。 首先,需要获取被注解的类或方法的对象,然后通过Class...
    99+
    2023-10-24
    java
  • vue中怎么动态修改a标签的样式
    vue中怎么动态修改a标签的样式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。<!DOCTYPE html> <h...
    99+
    2024-04-02
  • mysql数据库中怎样修改注释
    这篇文章主要为大家展示了“mysql数据库中怎样修改注释”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql数据库中怎样修改注释”这篇文章吧。方法:1、利用...
    99+
    2024-04-02
  • Java通过反射,如何动态修改注解的某个属性值
    Java反射动态修改注解的某个属性值 昨晚看到一条问题,大意是楼主希望可以动态得建立多个Spring 的定时任务。 这个题目我并不是很熟悉,不过根据题目描述和查阅相关Spring 创...
    99+
    2024-04-02
  • vue如何实现动态改变地址栏的参数值
    目录动态改变地址栏的参数值监听url地址栏参数变化1.传递参数2.监听参数变化动态改变地址栏的参数值 点击切换Tab,通过watch监听,在地址栏修改对应得active参数,这样刷新...
    99+
    2024-04-02
  • spring mvc中的@PathVariable动态参数详解
    目录springmvc@PathVariable动态参数springmvc是如何做到根据参数名动态绑定参数的?反射获取参数名-parameters参数-g参数ASMSpringMVC...
    99+
    2024-04-02
  • 引用参数是否能修改调用函数中的值
    引用参数确实可以修改调用函数中的值,因为它们传递的是变量的地址,允许对原始变量进行直接修改。 引用参数是否能修改调用函数中的值 引言 在编程中,传递参数时有两种主要方法:按值传递和按引...
    99+
    2024-04-20
    引用参数 修改值 c++
  • Vue3中动态修改样式与级联样式优先顺序图文详解
    目录前言一、ref修改样式1、通过 Vue 的 ref 组件获取 DOM 元素节点2、通过 ref 修改 DOM 元素节点样式二、通过v-bind对Html元素的样式(style)进...
    99+
    2023-05-16
    vue3动态修改样式 vue动态修改样式 vue 级联样式优先顺序
  • Laravel中怎么进行动态的config修改
    本篇内容主要讲解“Laravel中怎么进行动态的config修改”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Laravel中怎么进行动态的config修改”吧!Laravel中的config文...
    99+
    2023-07-06
  • 在Oracle实例关闭时怎样修改spfile的参数
    这篇文章给大家分享的是有关在Oracle实例关闭时怎样修改spfile的参数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体的操作如下:一、查询sga大小SQL>&nbs...
    99+
    2024-04-02
  • php怎么修改数组中的键值
    这篇文章主要介绍“php怎么修改数组中的键值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php怎么修改数组中的键值”文章能帮助大家解决问题。一、使用array_combine()和array_ke...
    99+
    2023-07-05
  • 使用指针参数是否能修改调用函数中的值
    指针参数允许函数修改调用函数中的值:创建指针变量,它存储要修改的变量的地址。将指针参数声明为函数声明中的参数。在调用函数时,将变量的地址作为参数传递。在函数内部,使用解引用运算符 (*)...
    99+
    2024-04-19
    函数参数 关键字:指针
  • Vue怎么动态修改el-table的某列数据
    这篇文章主要介绍“Vue怎么动态修改el-table的某列数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue怎么动态修改el-table的某列数据”文章能帮助大家解决问题。动态修改el-tab...
    99+
    2023-06-30
  • sql中怎么修改数据类型的值
    在 sql 中修改数据类型涉及以下步骤:确定要修改的数据类型;选择目标数据类型;转换数据(如需);确认更改。 如何修改 SQL 数据类型的值 修改数据类型的值是维护数据库的重要任务。下...
    99+
    2024-05-12
  • Android WebView通过动态的修改js去拦截post请求参数实例
    需求背景: 需要在用户点击提交按钮的时候拦截用户提交的数据。 遇到的问题: 1.页面不是自家前端做的,不能修改网页中的代码 2.要拦截的请求不是get请求,而是一个post请求...
    99+
    2022-06-06
    参数 post请求 webview 动态 js post Android
  • 怎么用Spring的spel获取自定义注解参数值
    这篇文章主要介绍了怎么用Spring的spel获取自定义注解参数值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Spring的spel获取自定义注解参数值文章都会有所收获,下面我们一起来看看吧。spel获...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作