笔友城堡 - 可定义的个人主页

前言

简单记录一下Java面试注解(Annotation)相关知识点,记录于此,方便自己查阅。

正文

什么是注解

注解(Annotation)是一种为代码添加“元数据”的机制,本身不影响程序逻辑,但可以被编译器、框架或运行时读取并使用。

可以简单理解为:

给代码打“标签”

注解的作用

  1. 编译检查

  2. 代码分析

  3. 框架配置

  4. 运行时行为控制

典型场景:

  • 编译器提示(@Override
  • 框架注入(Spring @Autowired
  • 序列化(Jackson @JsonProperty
  • 测试框架(JUnit @Test

常见注解

注解作用
@Override表示方法重写
@Deprecated标识过时
@SuppressWarnings抑制编译器警告
@FunctionalInterface函数式接口校验
@Override
public String toString() {
    return "...";
}

元注解

元注解:用来注解“注解”的注解

@Target

注解能用在哪里

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

常见取值:

  • TYPE(类、接口)

  • METHOD

  • FIELD

  • PARAMETER

  • CONSTRUCTOR

@Retention

注解生命周期

@Retention(RetentionPolicy.RUNTIME)
策略说明
SOURCE只在源码中存在(编译丢弃)
CLASS字节码中存在(默认)
RUNTIME运行时可用(反射读取)

框架注解一般是 RUNTIME

@Documented

注解会被 javadoc 记录

@Inherited

子类可以继承父类的注解

自定义注解

  1. 定义注解

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Log {
        String value() default "";
        boolean printParam() default false;
    }
  2. 使用注解

    @Log(value = "查询用户", printParam = true)
    public User getUserById(Long id) {
        ...
    }

问答

  1. 注解能在运行时生效吗?

    可以,前提是 @Retention(RUNTIME)

  2. 注解可以继承吗?

    注解本身不能继承

    但可以用 @Inherited让子类继承父类注解

  3. 注解里可以有方法吗?

    可以,但本质是 属性

    • 不能有参数
    • 返回值只能是基本类型、String、Class、枚举、注解、数组
  4. 注解的局限性
    • 注解不能继承
    • 注解不能修改已有逻辑
    • 过度使用会降低可读性
    • 强耦合于框架

小结

  1. 注解是Java提供的一种元数据机制,用于为代码添加描述信息

  2. 注解本身不影响程序逻辑,但可以在编译期、类加载期或运行期被读取和使用

  3. Java 提供了@Target 和 @Retention 等元注解来控制注解的使用范围和生命周期

  4. 自定义注解通常配合反射使用,在框架中实现配置、校验、日志等功能

参考文章

AI

相关网址

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...