温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎样自定义java注解

发布时间:2026-10-02 09:27:00 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

在 Java 中,自定义注解(Annotation)是通过 @interface 关键字来定义的,并结合元注解来规定注解的使用范围和生命周期。下面从基础到进阶给你讲清楚。


一、定义一个最简单的注解

public @interface MyAnnotation {
}

使用方式:

@MyAnnotation
public class Test {
}

但这只是“标记”,通常没什么实际作用。


二、注解中可以定义成员(属性)

public @interface MyAnnotation {
    String value();
    int count() default 1;
}

使用:

@MyAnnotation(value = "hello", count = 3)
public class Test {
}

如果只有一个 value(),可以省略名字:

@MyAnnotation("hello")

三、使用元注解(非常重要)

1️⃣ @Target:注解能用在哪里

import java.lang.annotation.*;

@Target(ElementType.METHOD)
public @interface MyAnnotation {
}

常见取值:

  • TYPE(类、接口)
  • METHOD(方法)
  • FIELD(字段)
  • PARAMETER(参数)
  • CONSTRUCTOR(构造方法)

可以多个:

@Target({ElementType.METHOD, ElementType.FIELD})

2️⃣ @Retention:注解保留到什么时候

@Retention(RetentionPolicy.RUNTIME)

三种策略:

  • SOURCE:只在源码中,编译后丢弃(如 @Override)
  • CLASS:编译进 class 文件,但运行时不可见
  • RUNTIME:运行时可通过反射获取(最常用)

3️⃣ @Documented:是否生成到 JavaDoc

@Documented

4️⃣ @Inherited:是否允许子类继承

@Inherited

只对类有效,对方法无效。


四、完整示例(运行时可用注解)

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String value() default "";
}

使用:

public class UserService {
    @Log("用户登录")
    public void login() {
    }
}

五、通过反射读取注解(关键)

import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        Method method = UserService.class.getMethod("login");
        if (method.isAnnotationPresent(Log.class)) {
            Log log = method.getAnnotation(Log.class);
            System.out.println(log.value());
        }
    }
}

六、常见应用场景

  • ✅ 权限校验(@RequiresPermission)
  • ✅ 日志记录(@Log)
  • ✅ 接口限流(@RateLimit)
  • ✅ 数据校验(@NotNull)
  • ✅ Spring / MyBatis 底层原理

七、小提醒

  • 注解本身不做任何逻辑
  • 真正的逻辑靠:
    • 反射
    • AOP
    • 编译期处理器(APT)

如果你愿意,我也可以给你讲:

  • ✅ Spring 中如何自定义注解 + AOP
  • ✅ 编译期注解(像 Lombok 那样)
  • ✅ 注解结合枚举、校验框架

你想深入哪一块?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手