【Java】自定义注解的使用

什么是注解

java中的,注解分为两种,元注解和自定义注解,类似于公理和定理的关系。我们常用一些注解:@Autowired@Override等都是自定义注解。

在JAVA中如何实现自定义注解?

@interface关键字

我们想定义一个自己的注解 需要使用 @interface来定义。

/**
 * 自定义注解 : 为字段添加一些自定义属性
 * @Author:lyj
 * @Date:2025/5/8 16:18
 */
@Target(ElementType.FIELD)      // 注解作用目标(字段)
@Retention(RetentionPolicy.RUNTIME) // 注解保留策略(运行时保留)
public @interface Column {
    String name() default "";   // 自定义字段名称
    boolean ignore() default false; // 是否忽略该字段
}

实现主机而处理器:

  /**
     *  返回序列化对象的值
     * @param object
     * @return
     */
    public static String toJsonString(Object object) throws IllegalAccessException {
        StringBuilder json = new StringBuilder();
        // 对象头部
        json.append("{");
        Class<?>  clazz = object.getClass();
        Field[] fields = clazz.getDeclaredFields();
        boolean  firstField = true;

        // 循环获取每个字段
        for (Field field : fields) {
            Column annaotation = field.getAnnotation(Column.class);
            if (annaotation == null || annaotation.ignore())  continue;

            if (!firstField) {
                json.append(",");
            }
            field.setAccessible(true);  // 允许访问私有字段
            String fieldName = annaotation.name().isEmpty() ? field.getName()  : annaotation.name();
            json.append("\"").append(fieldName).append("\"").append(":");
            Object value = field.get(object);
            if (value instanceof String) {
                json.append("\"").append(value).append("\"");
            }else {
                json.append(value);
            }
            firstField = false;
        }
        // 对象尾部
        json.append("}");
        return json.toString();
    }
}

注解的使用:

/**
 *  注解作用对象: 人
 * @Author:lyj
 * @Date:2025/5/8 16:22
 */
public class Person {
    // 序列化字段名称
    @Column(name =  "full_name")
    private String name;
    // 忽略改字段
    @Column(name = "age" , ignore = true)
    private  int age;
    // 邮件 : 使用默认配置(字段名称保持原样)
    @Column
    private String email;

    public Person(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
}
Person person = new Person("lyj", 18, "lyj@163.com");
System.out.println(JsonSerializer.toJsonString(person));  // {"name":"lyj","age":18,"email":"lyj@163.com"}

运行结果:
image

元注解

光加上@interface关键字还不够,我们需要了解5大元注解

元注解 说明 使用 枚举类
@Retention 指定注解的生命周期 @Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE) 注解只保留在源文件,当JAVA文件编译成class文件的时候,注解会被遗弃(.java文件)
@Retention(RetentionPolicy.CLASS)注解只保留在class文件,当jvm加载class文件时,被遗弃,这是默认的生命周期
@Retention(RetentionPolicy.RUNTIME)注解不仅被保存在class文件中,jvm加载class之后,仍然存在(内存的字节码中)
@Target 指定注解可以修饰的元素类型 @Target(ElementType.FIELD) @Target(ElementType.ANNOTATION_TYPE) 标记的注解可应用于注解类型
@Target(ElementType.CONSTRUCTOR) 标记的注解可应用于构造函数
@Target(ElementType.FIELD) 标记的注解可以用英语字段或属性
@Target(ElementType.LOCAL_VARIABLE) 标记的注解可以应用于局部变量
@Target(ElementType.METHOD)标记的注解看应用于方法
@Target(ElementType.PACKAGE)标记的主机可以应用于包声明
@Target(ElementType.PARAMETER) 标记的注解可以应用于方法的参数
@Target(ElementType.TYPE)标记的注解可以应用于任何元素
@Documented 指定的注解会被JavaDoc工具提取成文档。默认情况下,JavaDoc是不包括文档的。 @Documented
@Inherited 表示该注解会被子类继承。注意,仅针对类,成员属性、方法并不收此注释的影响。 @Inherited
@Repeatable 表示可以重复利用,为了解决同一个注解不能重复在同一类/方法/属性上引用 @Repeatable

最常用的元注解还是@Retention@Target

简单的自定义注解

开始的例子,已经实现了简单的自定义注解。可以通过获取到注解的方法,获取到当前注解的值。

创建注解时,应注意:

  1. 注解必须由public修饰,默认public;
  2. 一般注解元素以名词命名,若只有一个,建议名称为value;
  3. 注解元素类型只能是基本数据类型、基本数据类型数组或注解类型(注意嵌套);
  4. default指定注解元素默认值时,值类型必须与注解元素类型相同。

使用时应注意

  1. 若无注解元素,可省略() 小括号;
  2. 若注解类型为数组,且赋值时只有一个值时,可以省略{}花括号;
  3. 如果只有一个注解元素,且注解元素名为value
  4. ElementTypePACKAGE,则此注解用于标注在package-info.java文件中。(这个文件默认是不创建的。在idea中,双击shift可搜索到,打开是才会创建。)
posted @ 2024-11-13 16:15  陆陆无为而治者  阅读(191)  评论(0)    收藏  举报