首页 > 其他分享 >注解

注解

时间:2024-07-13 23:41:40浏览次数:14  
标签:String bookName field 注解 JsonField name

注解

  • 注解的生命周期有 3 种策略,定义在 RetentionPolicy 枚举中

1)SOURCE:在源文件中有效,被编译器丢弃。

2)CLASS:在编译器生成的字节码文件中有效,但在运行时会被处理类文件的 JVM 丢弃。

3)RUNTIME:在运行时有效。这也是注解生命周期中最常用的一种策略,它允许程序通过反射的方式访问注解,并根据注解的定义执行相应的代码。

package test.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

// JsonField 注解的生命周期是 RUNTIME,也就是运行时有效。
@Retention(RetentionPolicy.RUNTIME)
// JsonField 注解装饰的目标是 FIELD,也就是针对字段的。
@Target(ElementType.FIELD)
// 创建注解需要用到@interface关键字。
@interface JsonField {
    // JsonField注解有一个参数,名字为value,类型为String,默认值为一个空字符串
    // value允许注解的使用者提供一个无需指定名字的参数
    // default允许在一个字段上直接使用@JsonField,而无需指定参数的名和值。
    public String value() default "";
}

class Writer {
    private int age;

    // name上的@JsonField注解提供了显式的字符串值。
    @JsonField("writerName")
    private String name;

    // bookName上的@JsonField注解使用了缺省项。
    @JsonField
    private String bookName;

    public Writer(int age, String name, String bookName) {
        this.age = age;
        this.name = name;
        this.bookName = bookName;
    }

    @Override
    public String toString() {
        return "Writer{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", bookName='" + bookName + '\'' +
                '}';
    }
}

class JsonSerializer {
    // 序列化对象
    public static String serialize(Object object) throws IllegalAccessException {
        Class<?> objectClass = object.getClass();
        Map<String, String> map = new HashMap<>();
        // objectClass.getDeclaredFields()通过反射的方式获取对象声明的所有字段
        for (Field field : objectClass.getDeclaredFields()) {
            // 将反射对象的可访问性设置为 true,供序列化使用
            field.setAccessible(true);
            //  判断字段是否装饰了JsonField注解
            if (field.isAnnotationPresent(JsonField.class)) {
                map.put(getSerializedKey(field), (String) field.get(object));
            }
        }
        return toJsonString(map);
    }

    private static String getSerializedKey(Field field) {
        // 获取字段上注解的值
        String annotationValue = field.getAnnotation(JsonField.class).value();
        // 如果注解的值是空的,则返回字段名
        return annotationValue.isEmpty() ? field.getName() : annotationValue;
    }

    // 借助Stream流的方式返回格式化后的JSON字符串
    private static String toJsonString(Map<String, String> jsonMap) {
        String elementsString = jsonMap.entrySet()
                .stream()
                .map(entry -> "\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"")
                .collect(Collectors.joining(","));
        return "{" + elementsString + "}";
    }
}

public class Test {
    public static void main(String[] args) throws IllegalAccessException {
        Writer writer = new Writer(18, "二狗", "劲椎病康复指南");
        // {"bookName":"劲椎病康复指南","writerName":"二狗"}
        // age字段没有装饰@JsonField注解,所以没有序列化
        // name字段装饰了@JsonField注解,并且显示指定了字符串“writerName”,所以序列化后变成了 writerName。
        // bookName字段装饰了@JsonField注解,但没有显式指定值,所以序列化后仍然是 bookName。
        System.out.println(JsonSerializer.serialize(writer));
    }
}

标签:String,bookName,field,注解,JsonField,name
From: https://www.cnblogs.com/sprinining/p/18300993

相关文章

  • SpringMVC异常处理器,通过注解方式配置
    SpringMVC在处理器方法执行过程中出现了异常,可以采用异常处理器进行应对。一句话概括异常处理器作用:处理器方法执行过程中出现了异常,跳转到对应的视图,在视图上展示友好信息。配置ExceptionControllerpackagecom.powernode.springmvc.controller;importorg.springframewo......
  • Smart-doc:零注解侵入的API接口文档生成插件
    零注解侵入的API接口文档生成插件——Smart-docsmart-doc是一款同时支持JAVARESTAPI和ApacheDubboRPC接口文档生成的工具,在业内率先提出基于JAVA泛型定义推导的理念,完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中。你只需要按照java-doc标准编写......
  • MyBatis - 注解开发
    注解开发1.MyBatis注解之前的实例中,利用MyBatis进行开发时,一旦添加新的方法,则每次都需要在XML配置文件中进行映射。而现在随着注解开发的大肆流行,MyBatis3也提供了基于注解的配置。但是通过注解的方式表达力和灵活性有限,必要时要是需要通过mapper配置文件来进行......
  • Spring推荐使用构造注入而不使用 @Autowired 注解
    参考:https://www.youtube.com/watch?v=CT8dbbe783shttps://blog.csdn.net/qq_43371556/article/details/123529701https://blog.csdn.net/qq_33721382/article/details/104071801https://blog.csdn.net/fudaihb/article/details/139231192什么是依赖注入DI(Dependency......
  • Java中的SpringAOP、代理模式、常用AspectJ注解详解
      这篇文章主要介绍了Java中的SpringAOP、代理模式、常用AspectJ注解详解,Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务,例如审计和事务管理进行内聚性的开发,需要的朋友可以参考下 +目录一、AOP简述回到主题,何为AOP?AOP即面向切面编......
  • swagger注解文档
    swagger注解文档1.@Api()作用于类,放置于controller的一个类上,标志这个类是swagger资源1.1参数:参数名称参数介绍备注value说明,可以使用tags替代tags说明1.2实例代码:@Api(value="swagger2测试api",tags="管理员")@RequestMapping("/api/a......
  • 关于事务回滚注解@Transactional
    在使用Spring的@Transactional注解时,有时会出现事务失效的情况。这通常是由于一些常见的配置或使用错误引起的。以下是事务失效的原因和处理方法:常见原因方法可见性@Transactional注解的方法必须是public的。SpringAOP代理只会拦截public方法,非public方法(如private、protect......
  • @ConditionalOnClass注解解析
    文章目录概要Bean注册过程@ConditionalOnClass注解总结概要springboot中各种@ConditionalXxx注解控制着Bean是否注册,只有满足了一定条件才会被注册到容器中。这些注解包含@ConditionalOnClass、@OnBeanCondition、@ConditionalOnProperty等等,这篇文章就和大家探究下......
  • 注解
    注解AnnotationAnnotation作用:不是程序本身,对程序作出解释(这一点和注释(comment)没什么区别)可以被其他程序(如:编译器)读取格式:注解是以"@注解名''在代码中存在的,还可以添加一些参数值,如:@SuppressWarings(value="unchecked")在哪里使用:可以附加在packa......
  • Spring的@Value注解和SpringBoot yml配置项目实战踩坑总结
    知识点Spring提供了@Value注解,可用于将配置文件或注册中心的属性值动态注入到Bean中。注:@Value注解在spring-beans包里。@Value("${...}"):注入获取对应属性文件中定义的属性值;@Value("#{...}"):表示SpEl表达式通常用来获取Bean的属性;实例/***服务内动态配置**@au......