程序员子龙(Java面试 + Java学习) 程序员子龙(Java面试 + Java学习)
首页
学习指南
工具
开源项目
技术书籍

程序员子龙

Java 开发从业者
首页
学习指南
工具
开源项目
技术书籍
  • 基础

    • java 学习路线图
    • HashMap 详解
    • Java 8 日期和时间 - 如何获取当前时间和时间戳?
    • Java 模板变量替换(字符串、占位符替换)
    • JDK 代理
    • Java SPI 详解
    • java stream 看这一篇文章就够了
    • Java 泛型详解
    • Java 动态修改注解值
      • 如何正确遍历删除List中的元素
      • 什么是Java注解
      • 异步编程神器:CompletableFuture详解
      • FIFO 、LRU、LFU算法
      • 十进制转十六进制
      • java中double类型数据加减乘除操作精度丢失问题及解决方法
      • JAVA利用反射清除实体类对应字段
      • JSON转换问题最全详解(json转List,json转对象,json转JSONObject)
      • java 8 List 根据某个字段去重
      • Java List排序
      • 压缩算法:字符串(JSON)压缩和解压【JDK之Deflater压缩与Inflater解压】
      • BCD码是什么?
      • Java二进制、八进制、十进制、十六进制转换
      • Java String字符串 与 ASCII码相互转换
      • 什么是跨域?解决方案有哪些?
      • Java 16进制字符串转10进制
      • LinkedHashMap实现LRU - 附重点源码解析
      • 去掉 if...else 的七种绝佳之法
      • 一眼看清@JSONField注解使用与效果
    • JVM

    • Spring

    • 并发编程

    • Mybatis

    • 网络编程

    • 数据库

    • 缓存

    • 设计模式

    • 分布式

    • 高并发

    • SpringBoot

    • SpringCloudAlibaba

    • Nginx

    • 面试

    • 生产问题

    • 系统设计

    • 消息中间件

    • Java
    • 基础
    程序员子龙
    2024-01-29
    目录

    Java 动态修改注解值

    有的场景需要动态修改注解中的属性值。 可以使用反射或者是spring EL 表达式。

    定义注解

    @Documented
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface FieldInfo {
        int order();
    
        int size() default -1;
     }
    
    1
    2
    3
    4
    5
    6
    7
    8

    # 反射

    动态修改data字段上FieldInfo注解中的size属性值。利用Java的“反射”实现在程序中根据业务进行动态的修改。

    Field sample = UploadImageRequest.class.getDeclaredField("data");
    FieldInfo annotation = sample.getAnnotation(FieldInfo.class);
    InvocationHandler handler = Proxy.getInvocationHandler(annotation);
    Field field = handler.getClass().getDeclaredField("memberValues");
    field.setAccessible(true);
    Map map = (Map) field.get(handler);
    //报文长度
    int packetLength = in.getUnsignedShortLE(2);
    map.put("size",10);
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    这样size属性值就修改了。

    # spring EL

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    @Documented
    public @interface RedisLock {
        String value();
    
        String param() default "";
    
        long waitTime() default 30L;
    
        long leaseTime() default 100L;
    
        TimeUnit timeUnit() default TimeUnit.SECONDS;
    
        LockType type() default LockType.FAIR;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @RedisLock(value = "key",param = "#query.id",leaseTime = 30L)
    public Vo update(Query query) {
    }
    
    1
    2
    3
    @Around("@annotation(redisLock)")
    public Object aroundRedisLock(ProceedingJoinPoint point, RedisLock redisLock) {
        String lockName = redisLock.value();
        Assert.hasText(lockName, "@RedisLock value must have length; it must not be null or empty");
        String lockParam = redisLock.param();
        String lockKey;
        if (StringUtil.isNotBlank(lockParam)) {
            String evalAsText = this.evalLockParam(point, lockParam);
            lockKey = lockName + ':' + evalAsText;
        } else {
            lockKey = lockName;
        }
    }
    
    private static final BladeExpressionEvaluator EVALUATOR = new BladeExpressionEvaluator();
    
    
    private String evalLockParam(ProceedingJoinPoint point, String lockParam) {
        MethodSignature ms = (MethodSignature)point.getSignature();
        Method method = ms.getMethod();
        Object[] args = point.getArgs();
        Object target = point.getTarget();
        Class<?> targetClass = target.getClass();
        EvaluationContext context = EVALUATOR.createContext(method, args, target, targetClass, this.applicationContext);
        AnnotatedElementKey elementKey = new AnnotatedElementKey(method, targetClass);
        return EVALUATOR.evalAsText(lockParam, elementKey, context);
    }
    
      @Nullable
        public String evalAsText(String expression, AnnotatedElementKey methodKey, EvaluationContext evalContext) {
            return (String)this.eval(expression, methodKey, evalContext, String.class);
        }
    
        @Nullable
        public <T> T eval(String expression, AnnotatedElementKey methodKey, EvaluationContext evalContext, @Nullable Class<T> valueType) {
            return this.getExpression(this.expressionCache, methodKey, expression).getValue(evalContext, valueType);
        }
    
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    上次更新: 2024/03/13, 15:24:21
    Java 泛型详解
    如何正确遍历删除List中的元素

    ← Java 泛型详解 如何正确遍历删除List中的元素→

    最近更新
    01
    一个注解,优雅的实现接口幂等性
    11-17
    02
    MySQL事务(超详细!!!)
    10-14
    03
    阿里二面:Kafka中如何保证消息的顺序性?这周被问到两次了
    10-09
    更多文章>
    Theme by Vdoing | Copyright © 2024-2024

        辽ICP备2023001503号-2

    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式