当前位置: 首页 > article >正文

Java中的注解(Annotation)

        Java中的注解(Annotation)是一种用于在代码中添加元数据的机制。它们可以被用来为类、方法、变量、参数等元素添加额外的信息,这些信息在编译时或运行时可以被读取和使用。注解本身不会直接影响代码的执行,但可以通过反射等机制在运行时对代码进行处理。

注解的作用

  1. 编译检查:通过注解,编译器可以进行一些特定的检查,例如@Override注解可以确保方法是重写父类的方法。
  2. 代码生成:一些框架(如Spring)使用注解来生成额外的代码或配置文件。
  3. 运行时处理:通过反射机制,可以在运行时读取注解信息,从而进行一些动态处理。

常见的内置注解

  1. @Override:用于标识一个方法是重写父类的方法。
  2. @Deprecated:用于标识一个方法、类或字段已经过时,不建议使用。
  3. @SuppressWarnings:用于抑制编译器警告。

示例代码

1. @Override
public class Parent {
    public void doSomething() {
        System.out.println("Parent doing something");
    }
}

public class Child extends Parent {
    @Override // 标识这个方法是重写父类的方法
    public void doSomething() {
        System.out.println("Child doing something");
    }
}
2. @Deprecated
public class MyClass {
    @Deprecated // 标识这个方法已经过时
    public void oldMethod() {
        System.out.println("This method is deprecated");
    }

    public void newMethod() {
        System.out.println("Use this method instead");
    }
}
3. @SuppressWarnings
public class SuppressWarningsExample {
    @SuppressWarnings("unchecked") // 抑制未检查的转换警告
    public void someMethod() {
        List list = new ArrayList();
        list.add("Hello"); // 这里会有未检查的转换警告
    }
}

自定义注解

        除了内置注解,Java还允许开发者自定义注解。自定义注解是通过@interface关键字来定义的。注解可以包含元素(类似于方法),这些元素可以有默认值。此外,自定义注解还可以使用元注解(如@Retention@Target)来指定注解的生命周期和作用目标。

示例:定义一个简单的自定义注解

示例:自定义注解

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

@Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时可用
@Target(ElementType.METHOD) // 指定注解只能用于方法
public @interface MyAnnotation {
    String value(); // 注解的元素,可以有默认值
    int count() default 1; // 带有默认值的元素
}

使用自定义注解

定义好注解后,可以在代码中使用它。使用注解时,需要为注解的元素提供值。

示例:在方法上使用自定义注解
public class UseMyAnnotation {
    @MyAnnotation(value = "This is a custom annotation", count = 5)
    public void annotatedMethod() {
        System.out.println("Method with custom annotation");
    }
}

处理自定义注解

        通过反射机制,可以在运行时读取和处理注解信息。反射允许我们在运行时检查类、方法、字段等元素上的注解。

import java.lang.reflect.Method;

public class AnnotationProcessor {
    public static void main(String[] args) throws NoSuchMethodException {
        Method method = UseMyAnnotation.class.getMethod("annotatedMethod");
        if (method.isAnnotationPresent(MyAnnotation.class)) {
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
            System.out.println("Annotation value: " + annotation.value());
            System.out.println("Annotation count: " + annotation.count());
        }
    }
}

详细步骤解析

  1. 定义注解

    • 使用@interface关键字定义注解。
    • 使用@Retention指定注解的生命周期(SOURCE、CLASS、RUNTIME)。
    • 使用@Target指定注解的作用目标(TYPE、METHOD、FIELD等)。
    • 定义注解的元素,可以有默认值。
  2. 使用注解

    • 在类、方法、字段等元素上使用注解。
    • 为注解的元素提供值。
  3. 处理注解

    • 使用反射机制在运行时读取注解信息。
    • 检查元素上是否存在特定注解。
    • 获取注解的元素值并进行相应处理。

通俗易懂的解释

  • 定义注解:就像创建一个特殊的标签(注解),这个标签可以包含一些信息(元素),并且可以告诉编译器和虚拟机这个标签什么时候有效(生命周期),以及可以贴在什么地方(作用目标)。
  • 使用注解:就像在代码上贴上这个特殊的标签,标签上的信息可以帮助编译器或程序员理解代码的意图。
  • 处理注解:就像在运行时检查这些标签,读取标签上的信息,并根据这些信息做出相应的动作。

     我们可以看到注解在Java中的多种用途和用法。注解不仅可以帮助开发者进行编译时检查,还可以在运行时提供额外的信息,从而实现更灵活和动态的代码处理。

注解(Annotation)和注释(Comment)

注解(Annotation)

  1. 定义:注解是一种用于在代码中添加元数据的机制。它们可以被用来为类、方法、变量、参数等元素添加额外的信息。
  2. 用途:注解本身不会直接影响代码的执行,但可以通过反射等机制在编译时或运行时对代码进行处理。注解常用于编译检查、代码生成、运行时处理等。
  3. 语法:注解使用@符号开头,例如@Override@Deprecated
  4. 生命周期:注解可以有不同的生命周期,包括源码级别(SOURCE)、编译时(CLASS)和运行时(RUNTIME)。

注释(Comment)

  1. 定义:注释是用于向代码中添加解释性文本的机制。它们用于帮助开发者理解代码的意图和逻辑。
  2. 用途:注释仅用于代码的可读性,不会被编译器或虚拟机处理。它们在编译时会被忽略。
  3. 语法:注释有多种形式,包括单行注释(//)、多行注释(/* ... */)和文档注释(/** ... */)。
  4. 生命周期:注释仅存在于源码中,编译后不会保留在字节码中。

示例对比

注解示例
@Override // 这是一个注解,用于标识方法重写
public void doSomething() {
    System.out.println("Child doing something");
}
注释示例
// 这是一个单行注释,用于解释代码的意图
public void doSomething() {
    /*
    这是一个多行注释,
    用于解释方法的详细逻辑
    */
    System.out.println("Child doing something");
}

总结

  • 注解:用于添加元数据,可以通过反射等机制在编译时或运行时处理,不影响代码执行,但可以影响编译器的行为。
  • 注释:用于添加解释性文本,仅用于提高代码可读性,不会被编译器或虚拟机处理。

通过上述对比,我们可以清楚地看到注解和注释在Java中的区别和各自的作用。


http://www.kler.cn/news/284848.html

相关文章:

  • 谷粒商城实战笔记-269~271-商城业务-订单服务-bug修改
  • Python3遍历文件夹下的文件
  • AI编码新时代:免费人工智能助手Blackbox AI
  • Spring Boot 集成 JdbcTemplate(盘它!)
  • 使用WSL在Windows上安装Linux
  • 【微信小程序】SpringBoot集成微信小程序(多小程序集成)
  • opencv/c++的一些简单的操作(入门)
  • 趣味算法------多重背包问题
  • 【拉取Git项目到本地,知识小记,后续再改】
  • EmguCV学习笔记 VB.Net 8.1 漫水填充法 floodFill
  • volatile 关键字
  • Mac 安装Hadoop教程
  • 【算法每日一练及解题思路】计算以空格隔开的字符串的最后一个单词的长度
  • Linux - 如何在 Linux 中使用`find` 命令
  • JAVA安全之Velocity模板注入刨析
  • 字和字节的区别?
  • 分享两个方法分析python打包exe
  • Cookie、Session、Token:三者的区别与应用
  • 【QNX+Android虚拟化方案】112 - 获取 88Q5152 Switch Port1、Port2 端口的主从模式 / 传输速率 / 链路状态
  • 基于 web教学管理系统设计与实现
  • 筛法求欧拉函数
  • sysfs系统
  • Unity实战案例全解析 之 背包/贩卖/锻造系统(左侧类图实现)
  • 如何在JPG文件中隐写数据
  • 类实例化和构造函数
  • 【Go语言成长之路】使用 Go 和 Gin 开发 RESTful API
  • 五,Spring Boot中的 Spring initializr 的使用
  • go.uber.org/ratelimit 源码分析
  • MyBatis一级缓存和二级缓存以及 mybatis架构
  • .net开发日常笔记(持续更新)