温馨提示×

温馨提示×

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

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

java注解如何生效

发布时间:2026-10-22 21:59:04 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

在 Java 中,注解(Annotation)本身不会自动“生效”,它只是“元数据”。注解要真正起作用,通常有三种方式:


一、注解生效的三种主要方式

1️⃣ 编译期生效(由编译器处理)

例子:

  • @Override
  • @Deprecated
  • @SuppressWarnings

原理:

  • 编译器在编译时读取注解
  • 根据注解做校验或警告

示例:

@Override
public String toString() {
    return "hello";
}

✅ 如果方法签名不对,编译器直接报错


2️⃣ 运行期通过反射生效(最常见)

例子:

  • Spring 的 @Autowired
  • JUnit 的 @Test
  • 自定义注解

原理:

  • 注解必须保留到运行时:@Retention(RetentionPolicy.RUNTIME)
  • 通过反射读取注解并处理

自定义注解示例

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
}
public class Service {
    @Log
    public void doSomething() {
        System.out.println("执行方法");
    }
}

通过反射“让注解生效”

Method method = Service.class.getMethod("doSomething");
if (method.isAnnotationPresent(Log.class)) {
    System.out.println("方法被 @Log 标记");
}

⚠️ 注解本身不做任何事,必须有代码去“读它”


3️⃣ 运行期通过框架/代理/AOP生效(Spring 等)

例子:

  • @Transactional
  • @RequestMapping
  • @Cacheable

原理:

  • 框架在启动时扫描注解
  • 通过:
    • 反射
    • 动态代理
    • AOP 来“增强”方法

Spring 示例

@Service
public class UserService {
    @Transactional
    public void save() {
        // 数据库操作
    }
}

✅ Spring 会:

  • 扫描 @Transactional
  • 创建代理对象
  • 在方法前后开启/提交事务

二、让注解“真正生效”的关键点

✅ 1. 设置正确的保留策略

@Retention(RetentionPolicy.RUNTIME)

否则运行时拿不到注解


✅ 2. 设置作用目标

@Target(ElementType.METHOD)

✅ 3. 有“处理器”

注解不会自己生效,必须有:

  • 编译器
  • 反射代码
  • 框架容器

三、一句话总结

Java 注解本身只是“标签”,是否生效,取决于有没有“读取并处理它的代码”。

如果你愿意,我可以:

  • 写一个最小可运行的自定义注解 Demo
  • 讲 Spring 是如何让注解生效的
  • 对比 编译期 vs 运行期注解

你想看哪一个?

向AI问一下细节

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

AI
助
手