Java 注解(Annotation)


注解(Annotations)是Java语言中的一种元数据提供方式,用于在代码中嵌入额外的信息。注解不直接影响代码的执行,但可以被编译器、工具以及运行时环境读取和处理,从而实现特定的功能。Java中的注解可以用于类、方法、字段、参数、包等多个层次。

常见的Java内置注解

  1. @Override

    • 用于标记方法,表示该方法覆盖了父类中的方法。如果父类中没有被覆盖的方法,编译器会报错。
    @Override
    public String toString() {
        return "This is an example";
    }
    
  2. @Deprecated

    • 表示某个元素(类、方法等)已经过时,不建议使用。如果使用了被标记的元素,编译器会发出警告。
    @Deprecated
    public void oldMethod() {
        // Do something
    }
    
  3. @SuppressWarnings

    • 用于抑制编译器的特定警告信息。
    @SuppressWarnings("unchecked")
    public void test() {
        List list = new ArrayList();
    }
    

元注解

元注解是用于注解其他注解的注解,Java内置的元注解包括:

  1. @Retention

    • 用于指定注解的保留策略(即注解的生命周期)。保留策略包括:
      • RetentionPolicy.SOURCE:注解只保留在源代码中,编译时会被丢弃。
      • RetentionPolicy.CLASS:注解保留在字节码文件中,运行时不会被加载到虚拟机中。
      • RetentionPolicy.RUNTIME:注解保留在字节码文件中,运行时也会加载到虚拟机中,可以通过反射读取。
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation {
        String value();
    }
    
  2. @Target

    • 用于指定注解的作用目标(即注解可以应用于哪些元素)。目标包括:
      • ElementType.TYPE:类、接口(包括注解类型)或枚举声明
      • ElementType.FIELD:字段声明(包括枚举常量)
      • ElementType.METHOD:方法声明
      • ElementType.PARAMETER:参数声明
      • ElementType.CONSTRUCTOR:构造方法声明
      • ElementType.LOCAL_VARIABLE:局部变量声明
      • ElementType.ANNOTATION_TYPE:注解类型声明
      • ElementType.PACKAGE:包声明
    @Target(ElementType.METHOD)
    public @interface MyMethodAnnotation {
        String value();
    }
    
  3. @Inherited

    • 用于指定某个注解是否可以被子类继承。如果一个注解类型使用了@Inherited,那么这个注解将被应用于该类的子类。
    @Inherited
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface MyInheritedAnnotation {
    }
    
  4. @Documented

    • 用于指定注解是否将包含在Javadoc中。
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface MyDocumentedAnnotation {
    }
    

自定义注解

可以根据需要创建自定义注解。以下是一个自定义注解的示例:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation {
    String value();
    int number() default 0;
}

可以使用default声明参数的默认值
只有一个参数成员,参数名为value
定义注解时经常使用空字符串或0作为默认值
定义注解方法的名称就是参数的名称

使用自定义注解

public class MyClass {

    @MyCustomAnnotation(value = "Test method", number = 1)
    public void test() {
        // Do something
    }
}

读取注解

通过反射可以读取注解:

import java.lang.reflect.Method;

public class AnnotationExample {
    public static void main(String[] args) {
        try {
            Method method = MyClass.class.getMethod("test");
            MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class);
            if (annotation != null) {
                System.out.println("Value: " + annotation.value());
                System.out.println("Number: " + annotation.number());
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

总结

注解在Java中是一种非常强大的工具,可以用于提供元数据,辅助编译器检查,配置框架和库,生成代码等。理解并合理使用注解可以大大提高代码的可读性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rsun04551

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值