Java注解(Annotation)是Java编程语言中的一个重要特性,它们提供了一种在源代码中添加元数据信息的方式,以便在编译、运行时或工具处理时使用。本文将深入探讨Java注解的核心概念和用途。
@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");
}
}
@Override
,还是会重写父类的方法;@Override
注解,编译器会检查是否真的重写了父类的方法,是则编译成功,反之报错。源码分析:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Target
:注解用于指定注解的使用范围(元注解的一部分),这里只能应用到方法;@Retention
:指定注解的保留策略(保留在哪儿),这里指的是保留在源码;public @interface Override
:
public
:表示这个自定义注解是公共的,可以在其他包中使用。@interface
:关键字用于定义一个自定义注解。@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 {
}
@Documented
:注解表示该注解应该被包含在Java文档中@Retention(RetentionPolicy.RUNTIME)
:注解表示这个注解在运行时可用。@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
:这里指定了多种目标元素类型,包括构造方法(CONSTRUCTOR)、字段(FIELD)、局部变量(LOCAL_VARIABLE)、方法(METHOD)、包(PACKAGE)、参数(PARAMETER)和类型(TYPE)。通常程序在编写过程中,会出现许多不必要的警告,这是可以使用@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
注解应该谨慎,并且应该仅在确定警告是安全的、没有更好的解决方案时使用。
滥用这个注解可能会掩盖潜在的问题。
主要的元注解有以下四种:
它用来指定注解的保留策略。在 Java 中,注解可以有三种保留策略,分别是:
RetentionPolicy.SOURCE
:这种保留策略表示注解仅在源代码级别存在,编译成字节码文件后就被丢弃,不会包含在编译后的类文件和运行时环境中。RetentionPolicy.CLASS
:这种保留策略表示注解会被保留到编译后的类文件中,但在运行时不可访问。这是默认的保留策略。RetentionPolicy.RUNTIME
:这种保留策略表示注解会被保留到编译后的类文件中,并且可以在运行时通过反射机制访问。这允许在运行时动态处理注解信息。源码分析:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
// 注解的定义内容
}
上述代码采用了运行时保留策略,可以在运行时通过反射访问该注解的内容。
它用来指定注解可以应用的元素,常见的如下:
ElementType.TYPE
:可以用在类、接口、枚举类型上。ElementType.FIELD
:可以用在字段(成员变量)上。ElementType.METHOD
:可以用在方法上。ElementType.PARAMETER
:可以用在方法的参数上。ElementType.CONSTRUCTOR
:可以用在构造函数上。ElementType.LOCAL_VARIABLE
:可以用在局部变量上。ElementType.ANNOTATION_TYPE
:可以用在注解上。ElementType.PACKAGE
:可以用在包上。源码分析:
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation {
// 注解的定义内容
}
@Documented
是 Java 中的一个元注解,用于指示其他注解是否应该包含在生成的文档中。
源码分析:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
@Documented
:自定义的注解将包括在生成的文档中;@Retention(RetentionPolicy.RUNTIME)
:表示注解信息在运行时可用,这是因为只有在运行时才能够通过反射获取注解信息,这对于生成文档非常重要。@Target(ElementType.ANNOTATION_TYPE)
:表示注解只能在自定义的注解中使用它用于指示一个自定义注解是否应该被子类继承。
源码分析:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
通过这种方式,您可以更清晰地呈现每个注解的信息和源码分析,使读者更容易理解和学习Java注解的使用。希望这次的修改对您有所帮助!如果需要进一步的修改或补充,请随时提出。