一片文章让你懂Java Annotation

本文深入浅出地介绍了Java注解的概念及其应用场景,包括注解的定义、使用方式以及如何通过反射技术提取注解信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      谈起注解和反射大部分初学者容易一脸懵逼,这是为何呢?我想主要有两方面的原因:1、相当一部分人工作中开发时很少用到,没有实践过只是看看的话,80%的人过会就忘了,如何注解像集合框架一样大家每天都会用到的话或许大家就不会觉得这东西有啥可神秘的了    2、注解和反射这两部分的知识网络上讲解的并不多也被传的很邪乎的样子,比较系统性的资源较少 。所以很多人都持保守态度,这篇文章将从以下几个方面讲解注解相关的知识,不包含元注解相关知识,只对自定义注解进行说明。,如果你是一个真正热衷技术的人希望你能静下心来看完。

     1、注解的定义(注解到底是个什么东西?)

     2、代码解释    (亲手写一个注解)

     3、注解的提取   

1、注解的定义:

    注解到底是什么呢?先来看看百度百科的 定义:

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。   它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

说实话定义的很准确不过太抽象了,但是从中可以找到一些关键语句如 “代码级别的说明”、“注释” 等。这就说明了注释其实和我们平时写的 "/** */"的注释的作用是一样的:不会对我们的代码产生任何影响,如果你不去处理它的话。举一个比较有说明性的例子:我们是一个人,但是我们可能有多个职业,比如说教师、工人、农民、学生。同样一个人也可能既是农民,又是教师。在这里的 “人”可以看做是我们的代码,教师、工人、农民、学生等一系列的职业就是注解,像一个个标签一样贴在我们的人身上,当然你也可以没有标签就是一个普通人,就算你有标签,你是一个农民教师,如果你不说也没人知道,不会对你产生任何影响,说到这里大家明白了?

2、注解的代码实现:关于注解的定义和所有属性就直接看下面的代码好了.

package com.daihui.quartz;

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

@Retention(RetentionPolicy.RUNTIME)
/**
 *Retention:保留期,说明我们的注解的生命周期。
 * RetentionPolicy常用取值:
 * SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
 * CLASS  注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
 * RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
 */
@Target(ElementType.ANNOTATION_TYPE)
/**
 * Target:注解的作用域。定义我们的注解可以在哪些地方使用。
 * ElementType常用取值:
 *    TYPE:可以给一个类型进行注解,比如类、接口、枚举
 *    FIELD:标记属性
 *    METHOD:标记方法
 *    PARAMETER:标记方法内参数
 *    CONSTRUCTOR:标记构造方法
 *    LOCAL_VARIABLE:标记本地变量
 *    ANNOTATION_TYPE:可以注释到另一个注解上即嵌套注解
 *    PACKAGE:标记包
 */
//注解定义和接口类似但是需要用  @  符号修饰
public @interface Teacher {
    //接下来我们可以定义注解的属性,即注解的成员变量
    //注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,
    //其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。如下:
    String id() ;

    /**
     * 属性的默认值需要用 default 关键字指定并且类型必须是
     * 8 种基本数据类型外加 类、接口、注解及它们的数组。
     */
    String profession() default "语文";
}

3、既然我们自定义了注解,当然要使用并提取我们定义的注解的信息了,这里我们需要用到反射相关的知识来提取注解信息:

package com.daihui.quartz;

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

/**
 * package-name: com.daihui.quartz
 * project-name: quartz
 * function : 
 * @author daihui
 * @since 2018/3/31 0031 23:13  
 */

//在这里我们使用了我们自定义的注解标记我们这个人是是一个教师,并且是一个教英语的教师
@Teacher(type = 1,profession = "英语")
public class Person {

    public static void main(String[] args) {
        /**
         *由于我们在上面定义的注解为 @Target (ElementType.TYPE),即作用于类上面
         *所以我们这里使用 Class 获取注解的相关信息
         */

        // isAnnotationPresent(Class<? extends Annotation> annotationClass) 方法判断我们的 person 类是否应用了某个注解
        boolean isAnnotationPresent = Person.class.isAnnotationPresent(Teacher.class);
        System.out.println("isAnnotationPresent:"+isAnnotationPresent);

        /**
         *  getAnnotation(Class<A> annotationClass) 方法直接获取指定类型的注解
         *  或者使用 getAnnotations() 直接获取该类上应用的注解数组
         */
        Teacher annotation = Person.class.getAnnotation(Teacher.class);

        System.out.println("type:"+annotation.type());
        System.out.println("profession:"+annotation.profession());
    }
}
运行结果如下:
isAnnotationPresent:true
type:1
profession:英语

作用于方法或者字段上的注解通用可以获得,但是就不是通过Class了,而是 Field 或者 Method ,在这里就不再赘述了,希望大家能够自己实践一下加深印象

看到了这里或许大家还是不知道注解到底有个啥用?如果你看到了这里请再移步到上面获取注解信息的代码,思考一下:我们获取了这个人的信息知道他是一个教师了,如果你有孩子了那是不是有可能这个教师是你孩子的老师,那么接下来是不是可以和老师谈谈人生?奋斗

总结:

  1. 如果注解难于理解,你就把它类同于标签,标签为了解释事物,注解为了解释代码。
  2. 注解的创建如同接口,只是多了个 @ 符号。
  3. 注解的属性包含8种基本类型以及类、接口、注解和他们的数组
  4. 注解的提取需要借助于 Java 的反射技术,由于反射比较慢,因此使用注解时也需要谨慎计较时间成本。
标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值