java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java注解(Annotations)定义使用

Java注解(Annotations)的定义和使用详解

作者:冰糖心书房

Java注解(Annotations)是Java5引入的一种元数据(Metadata),它提供了一种在源代码中嵌入补充信息的方式,这些信息可以被编译器、JVM或其他工具在编译时、运行时进行处理,注解本身不会直接影响程序的执行,但可以用来指导编译器、JVM或其他工具的行为,从而实现各种功能

Java 注解(Annotations)是 Java 5 引入的一种元数据(Metadata),它提供了一种在源代码中嵌入补充信息的方式,这些信息可以被编译器、JVM 或其他工具在编译时、运行时进行处理。

注解本身不会直接影响程序的执行,但可以用来指导编译器、JVM 或其他工具的行为,从而实现各种功能。

一、 注解的定义 (Annotation Definition)

什么是元数据 (Metadata)?

注解的语法

@Retention(RetentionPolicy.RUNTIME) // 元注解,指定注解的保留策略
@Target({ElementType.METHOD, ElementType.TYPE}) // 元注解,指定注解可以应用的程序元素类型
public @interface MyAnnotation { // 定义一个注解

    // 注解成员 (Annotation Members)
    String name() default "Default Name"; // 默认值
    int value(); // 必须赋值

    Class<?> type() default void.class; //类型
}

二、元注解 (Meta-Annotations)

元注解是用于修饰注解的注解,用于指定注解的特性。

1.@Retention

作用: 指定注解的保留策略 (Retention Policy),即注解在哪个阶段可用。

RetentionPolicy 枚举:

示例:

@Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时可用
public @interface MyAnnotation {
    // ...
}

2.@Target

作用: 指定注解可以应用的程序元素类型 (Target Element)。

ElementType 枚举:

示例:

@Target({ElementType.METHOD, ElementType.TYPE}) // 指定注解可以应用于方法和类
public @interface MyAnnotation {
    // ...
}

1.@Documented

作用: 指定该注解应该包含在 Javadoc 文档中。

示例:

@Documented // 指定该注解应该包含在 Javadoc 文档中
public @interface MyAnnotation {
    // ...
}

2.@Inherited

作用: 指定该注解可以被子类继承。

示例:

@Inherited // 指定该注解可以被子类继承
public @interface MyAnnotation {
    // ...
}

3.@Repeatable (Java 8+):

作用: 指定该注解可以在同一个程序元素上重复使用。

示例:

@Repeatable(Authorities.class)
public @interface Authority {
    String role();
}

public @interface Authorities {
    Authority[] value();
}

@Authority(role="Admin")
@Authority(role="Editor")
public class MyClass {
    // ...
}

三、内置注解 (Built-in Annotations)

Java 提供了一些内置注解,可以直接使用:

1.@Override

作用: 用于标记一个方法是重写 (Override) 了父类的方法。

用途:

示例:

class Animal {
    void eat() {
        System.out.println("Animal is eating.");
    }
}

class Dog extends Animal {
    @Override // 标记该方法重写了父类的 eat() 方法
    void eat() {
        System.out.println("Dog is eating.");
    }
}

2.@Deprecated

作用: 用于标记一个类、方法或字段已过时 (Deprecated),不建议使用。

用途:

示例:

@Deprecated // 标记该方法已过时
public void oldMethod() {
    // ...
}

/**
 * @deprecated Use {@link #newMethod()} instead.
 */
@Deprecated
public void oldMethodWithComment(){
    //...
}

public void newMethod() {
    // ...
}

3.@SuppressWarnings

作用: 用于抑制编译器发出的警告。

用途:

取值:

示例:

@SuppressWarnings("unchecked") // 抑制类型转换警告
List list = new ArrayList();
list.add("Hello");
String s = (String) list.get(0); // 编译器会发出 unchecked 类型转换警告

四、自定义注解 (Custom Annotations)

除了内置注解,你还可以根据自己的需求创建自定义注解。

定义注解:

使用注解:

处理注解 (Annotation Processing):

五、使用场景 (Annotation Usage Scenarios)

注解在 Java 中有着广泛的应用,主要包括以下场景:

编译时检查:

代码生成:

配置:

运行时行为修改:

六、代码示例 (自定义注解)

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时可用
@Target(ElementType.METHOD) // 指定注解可以应用于方法
public @interface MyAnnotation { // 定义一个自定义注解

    String name() default "Default Name"; // 成员变量,默认值Default Name
    int value();   // 成员变量

}

class MyClass {

    @MyAnnotation(name = "My Method", value = 100) // 使用注解并赋值
    public void myMethod() {
        System.out.println("My method is called.");
    }
}

public class AnnotationExample {

    public static void main(String[] args) throws Exception {
        Class<?> clazz = MyClass.class;
        Method method = clazz.getMethod("myMethod");

        if (method.isAnnotationPresent(MyAnnotation.class)) { // 判断方法是否使用了 MyAnnotation 注解
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class); // 获取注解对象

            System.out.println("Annotation name: " + annotation.name()); // 获取 name 成员的值
            System.out.println("Annotation value: " + annotation.value()); // 获取 value 成员的值
        }
    }
}

总结

Java 注解是一种强大的元数据机制,它可以在代码中嵌入补充信息,并在编译时或运行时被处理。 理解注解的定义、元注解、内置注解、自定义注解以及使用场景,可以帮助你编写更简洁、更灵活、更易于维护的 Java 代码。 掌握注解,能让你更深入地理解各种框架和库的运作方式,并能够自定义 Spring Boot Starter等功能.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文