【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"}
运行结果:

元注解
光加上@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。
简单的自定义注解
开始的例子,已经实现了简单的自定义注解。可以通过获取到注解的方法,获取到当前注解的值。
创建注解时,应注意:
- 注解必须由
public修饰,默认public; - 一般注解元素以名词命名,若只有一个,建议名称为
value; - 注解元素类型只能是基本数据类型、基本数据类型数组或注解类型(注意嵌套);
default指定注解元素默认值时,值类型必须与注解元素类型相同。
使用时应注意
- 若无注解元素,可省略
()小括号; - 若注解类型为数组,且赋值时只有一个值时,可以省略
{}花括号; - 如果只有一个注解元素,且注解元素名为
value。 - 若
ElementType为PACKAGE,则此注解用于标注在package-info.java文件中。(这个文件默认是不创建的。在idea中,双击shift可搜索到,打开是才会创建。)
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

浙公网安备 33010602011771号