Java-Annotation(注解)

这里写目录标题

  • 摘要
  • @Override
  • @Deprecated
  • @SuppressWarning
  • Annotation(元注解)
    • @Retention
    • @Target
    • @Documented
    • @Inherited

摘要

Java注解(Annotation)是Java编程语言中的一个重要特性,它们提供了一种在源代码中添加元数据信息的方式,以便在编译、运行时或工具处理时使用。本文将深入探讨Java注解的核心概念和用途。

@Override

@Override用于标记一个方法是否覆盖(重写)父类/接口中的方法。

使用范围:方法

Code

class Parent {
    public void printMessage() {
        System.out.println("Hello from Parent");
    }
}

class Child extends Parent {
    @Override
    public void printMessage() {
        System.out.println("Hello from Child");
    }
}

  1. 如果子类方法中没有添加@Override,还是会重写父类的方法;
  2. 写了@Override注解,编译器会检查是否真的重写了父类的方法,是则编译成功,反之报错。

源码分析

@Target(ElementType.METHOD)         
@Retention(RetentionPolicy.SOURCE)  
public @interface Override {  
		
}
  1. @Target:注解用于指定注解的使用范围(元注解的一部分),这里只能应用到方法;
  2. @Retention:指定注解的保留策略(保留在哪儿),这里指的是保留在源码;
  3. public @interface Override
    1. public:表示这个自定义注解是公共的,可以在其他包中使用。
    2. @interface:关键字用于定义一个自定义注解。
    3. 这个注解的名字是 Override,与Java语言中的 @Override 注解同名,但它们不同。

@Deprecated

@Deprecated注解标记一个类、方法、字段等用法已经过时,不推荐继续使用。

使用范围:类、方法、属性等

Code

public class DeprecatedExample {
    @Deprecated
    public void deprecatedMethod() {
        // 一些过时的操作
    }

    public void newMethod() {
        // 新的操作
    }

    public static void main(String[] args) {
        DeprecatedExample example = new DeprecatedExample();
        // 调用过时的方法,会产生编译警告
        example.deprecatedMethod();
        // 调用新的方法,没有问题
        example.newMethod();
    }
}

源码分析

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

  1. @Documented:注解表示该注解应该被包含在Java文档中
  2. @Retention(RetentionPolicy.RUNTIME):注解表示这个注解在运行时可用。
  3. @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) :这里指定了多种目标元素类型,包括构造方法(CONSTRUCTOR)、字段(FIELD)、局部变量(LOCAL_VARIABLE)、方法(METHOD)、包(PACKAGE)、参数(PARAMETER)和类型(TYPE)。

@SuppressWarning

通常程序在编写过程中,会出现许多不必要的警告,这是可以使用@SuppressWarning注解来一直警告信息。
Code

@SuppressWarnings("unchecked")
public List<String> getList() {
    List myList = new ArrayList(); // 未经检查的转换警告
    myList.add("Hello");
    myList.add("World");
    return myList;
}

@SuppressWarnings("deprecation")
public void useDeprecatedMethod() {
    SomeDeprecatedClass.deprecatedMethod(); // 废弃 API 使用警告
}

public void useRawType() {
    @SuppressWarnings("rawtypes")
    List myList = new ArrayList(); // 直接作用在变量上,原始类型警告
    myList.add("Hello");
    myList.add("World");
}

常见参数:

参数 说明
all 用于抑制所有类型的警告。这个参数应该慎用,因为它会抑制所有警告,包括潜在的问题。
rawtypes 用于抑制原始类型警告。原始类型警告通常在使用泛型时没有指定类型参数时出现。
deprecation 用于抑制废弃 API 使用警告。这种警告会在使用已被标记为废弃的方法或类时出现。

源码分析:

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD,ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

需要注意的是,使用 @SuppressWarnings 注解应该谨慎,并且应该仅在确定警告是安全的、没有更好的解决方案时使用。

滥用这个注解可能会掩盖潜在的问题。

Annotation(元注解)

主要的元注解有以下四种:

  1. @Target:指定注解的使用范围
  2. @Retention:指定注解的保留范围(SOURCE、CLASS、RUNTIME)
  3. @Documented:指定注解是否在javadoc体现
  4. @Inherited:子类是否会继承父类的注解

@Retention

它用来指定注解的保留策略。在 Java 中,注解可以有三种保留策略,分别是:

  1. RetentionPolicy.SOURCE:这种保留策略表示注解仅在源代码级别存在,编译成字节码文件后就被丢弃,不会包含在编译后的类文件和运行时环境中。
  2. RetentionPolicy.CLASS:这种保留策略表示注解会被保留到编译后的类文件中,但在运行时不可访问。这是默认的保留策略。
  3. RetentionPolicy.RUNTIME:这种保留策略表示注解会被保留到编译后的类文件中,并且可以在运行时通过反射机制访问。这允许在运行时动态处理注解信息。

源码分析

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    // 注解的定义内容
}

上述代码采用了运行时保留策略,可以在运行时通过反射访问该注解的内容。

@Target

它用来指定注解可以应用的元素,常见的如下:

  1. ElementType.TYPE:可以用在类、接口、枚举类型上。
  2. ElementType.FIELD:可以用在字段(成员变量)上。
  3. ElementType.METHOD:可以用在方法上。
  4. ElementType.PARAMETER:可以用在方法的参数上。
  5. ElementType.CONSTRUCTOR:可以用在构造函数上。
  6. ElementType.LOCAL_VARIABLE:可以用在局部变量上。
  7. ElementType.ANNOTATION_TYPE:可以用在注解上。
  8. ElementType.PACKAGE:可以用在包上。

源码分析

@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation {
    // 注解的定义内容
}

@Documented

@Documented 是 Java 中的一个元注解,用于指示其他注解是否应该包含在生成的文档中。

源码分析

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

  1. @Documented:自定义的注解将包括在生成的文档中;
  2. @Retention(RetentionPolicy.RUNTIME):表示注解信息在运行时可用,这是因为只有在运行时才能够通过反射获取注解信息,这对于生成文档非常重要。
  3. @Target(ElementType.ANNOTATION_TYPE):表示注解只能在自定义的注解中使用

@Inherited

它用于指示一个自定义注解是否应该被子类继承。

源码分析:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

通过这种方式,您可以更清晰地呈现每个注解的信息和源码分析,使读者更容易理解和学习Java注解的使用。希望这次的修改对您有所帮助!如果需要进一步的修改或补充,请随时提出。

你可能感兴趣的:(Java基础,java,开发语言)