注解Annotation学习基础篇

Java反射学习总结五(Annotation(注解)-基础篇) Annotation(注解)简介,如何自定义注解,使用反射调用注解 阅读详情

1.Annotation是什么?
注解是JDK5新增的,主要为程序增加元数据。Annotation是一种接 口,主要用来对JAVA应用程序元素设置元数据。需要通过JAVA反射技术获得Annotation对象,根据Annotation对象实例获取程序元素上的元数据信息即Annotation信息。
2.如何定义Annotation?
定义注解Annotation很简单,通过关键字@interface即可定义一个注解。下图自定义一个注解。

        @Documented
        @Target(ElementType.METHOD)
        @Inherited
        @Retention(RetentionPolicy.RUNTIME)
        public @interface MethodInfo {
        // 作者
        String author() default "tonny";
        // 日期
        String date();
        }

3.哪些程序元素可以使用注解?
JAVA应用中哪些程序元素可以使用Annotation。在JDK中另外一个AnnotatedElement接口代表了程序中可以使用Annotation的程序元素,JDK中具体的实现类主要有:
3.1 Class:JAVA类从面可以使用注解Annotation.
3.2. Constructor:构造器可以使用注解Annotation。
3.3. Method:JAVA类中的方法可以使用注解Annotation
3.4. Field:JAVA类中的成员变量可以使用Annotation,Spring中 很多场景。
3.5. Package: 类的包定义上使用注解
4.注解特点
4.1.注解中可以定义方法,但都是无参的方法,即不能有任何参数。
4.2.注解中的方法可以有默认值,必须使用default 赋值。上述中,就是采用default进行赋值
4.3.注解中的方法名和返回类型就是注解中的成员变量名和变量类型
4.4.注解的返回类型只能是基本类型,String,枚举类型,Annotation类型和这些类型组成的数组–非常重要
4.5.注解中如果定义成员变量,如果成员变量没有默认值(即没有使用default进行赋值),则在使用该注解时必须对成员变量进行赋值。
4.6.注解中可以包含元注解,元注解被用来定义自定义注解
5.四个元注解
JDK中提供了4个元数据注解,这4个元注解可以注解自定义注解
5.1@Target:
5.1.1.主要表明使用@Target注解的范围,可以在哪些应用程序元素中使用。

        @Documented
        @Retention(RetentionPolicy.RUNTIME)
        @Target(ElementType.ANNOTATION_TYPE)
        public @interface Target {
            ElementType[] value();
        }

5.1.2.@Target的注解范围通过ElementType枚举类数组指定:

public enum ElementType {
    /** Class, interface (including annotation type), or             enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE
}

5.1.3.上述程序中是元注释@Target源码,可以发现@target包含元注解,通过该ElementType.ANNOTATION_TYPE指明了注解的范围。
5.1.4.@Target注解的方法名为value,即成员变量名。返回类型为一个枚举ElementType。符合注解中方法的返回类型要求(枚举类型或枚举类型数组)
5.1.5.通常情况下使用注解中的方法时,应该使用”name=value”形式。即 上述程序中@Target(ElementType.ANNOTATION_TYPE)
应该为@Target(value = ElementType.ANNOTATION_TYPE)。如下情况特殊除外:
5.1.5.1如果自定义的注解中就含有一个成员变量而且成员变量的名称为value,则可以不需要使用name=value形式。
5.2@Retention
5.2.1使用@Retention修饰自定义的Annotation,表明该Annotation的声明周期

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

5.2.2上述源码表明@Retention生命周期通过RetentionPolicy控制。RetentionPolicy为枚举类,主要包含3个数值:
5.2.2.1.RetentionPolicy.SOURCE:编译器直接丢弃这种策略。
5.2.2.2.RetentionPolicy.CLASS:编译器将Annotation记录在CLASS文件中,但是JVM在运行时会抛弃。这也是默认行为
5.2.2.3RetentionPolicy的源码如下:

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}

5.3@Inherited
5.3.1@Inherited指定被它注解的Annotation将具有继承性质,如果某 个类使用了自定义注解A(A注解被@Inherited修饰),则A的子类也具有A注解的特性。
5.3.2@Inherited的源码如下,只是标记注解

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

5.4@Documented
5.4.1.@Documented修饰的注解可以被javadoc工具文档化。也是一个标记注解,源码如下:

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

6.自定义注解
6.1自定义注解只需要使用@interface声明即可,如下定义了MethodInfo注解

@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
    // 作者
    String author() default "tonny";
    // 日期
    String date();
    // 版本
    int version() default 1;
    // 注释
    String comments();
}

6.2.定义了AnnotationExample类,使用自定义注解,如下

public class AnnotationExample {

    @Override
    @MethodInfo(author="tonny",date="2016-08-11",comments="override toString method")
    public String toString(){
        return "Override toString method";
    }
    @Deprecated
    @MethodInfo(date="2016-08-11",comments="deprecated method")
    public void oldMethod(){
        System.out.println("deprecated method do not use it");
    }

    @SuppressWarnings(value = { "unchecked" })
    @MethodInfo(date="2016-08-11",comments="deprecated method")
    public List generateList(){
        List l = new ArrayList();
        l.add("a");
        l.add("b");
        return l;
    }
}

6.3.类AnnotationParse.java是一个简单的解析注解的小程序:

public class AnnotationParse {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            Method[] methods = AnnotationParse.class.getClassLoader()
            .loadClass("com.egfbank.annotaion.example1.AnnotationExample")
            .getMethods();
            for(Method m:methods){
                // getAnnotations()返回指定元素上所有的注释
                for(Annotation anno : m.getAnnotations()){
                    System.out.println("annotation : "+anno); 
                }            
                //检查 注解MethodInfo是否起到作用
                // 判断程序中指定元素上某个特定的注释是否存在
                if(m.isAnnotationPresent(MethodInfo.class)){
                    MethodInfo ma =  m.getAnnotation(MethodInfo.class);
                    System.out.println(ma.author());
                    System.out.println(ma.date());
                }
            }
        }catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

7.总结
7.1通过上述例子,可以看出注解必须和反射技术结合起来才能发挥重要的作用。灵活使用注解可以减少很多无用的代码的编写。

Java基础:Annotation注解 文章目录1. 注解的分类2. 元注解3. 注解元素4. 内置注解5. 注解的提取6. 自定义注解 注解在一定程度上是在把元数据与源代码文件结合在一起,而不是保存在外部文档中这一大的趋势下所催生的。注解可以提供用来完整的描述程序所需的信息,而这些信息是无法用Java来表达的。 因此,注解存储有关程序的额外信息,是可以由编译器来测试和验证的。注解还可以用来生成描述符文件,甚至是新的类定义,并且有助于减... 阅读详情

相关推荐

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3229

Carson带你学Java:带你一步步探索神秘的注解(Annotation)

前言 在 Java中,注解(Annotation)非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘 今天,我将献上一份 Java注解的介绍 & 实战攻略,希望你们会喜欢。 目录 1. 简介 定义:一种标识 / 标签 注解属于 Java中的一种类型,同 类class 和 接口interface 一样 在 Java S...

Carson带你学Android 7613

机器学习: 共轭梯度算法(PCG)

今天介绍数值计算和优化方法中非常有效的一种数值解法,共轭梯度法。我们知道,在解大型线性方程组的时候,很少会有一步到位的精确解析解,一般都需要通过迭代来进行逼近,而 PCG 就是这样一种迭代逼近算法。 我们先从一种特殊的线性方程组的定义开始,比如我们需要解如下的线性方程组: Ax=bAx=b 这里的 A(n×n)A(n×n) 是对称,正定矩阵, b(n×...

weixin_30807677的博客 3181

Java--Class类与反射+Annotation注解

通过Java的反射机制,可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问、检测、修改描述Java对象本身信息的功能。java.lang.reflect包提供了反射的支持。

qq_40132294的博客 637

逆向解析手淘x-sign签名算法:从抓包到API调用的完整实践

本文详细解析了手淘x-sign签名算法的逆向过程,从抓包工具选择到API调用实践,提供了完整的解决方案。通过分析签名参数组成和生成机制,帮助开发者理解并实现淘宝接口的合法调用,同时强调了安全与合规的重要性。

weixin_29323273的博客 605

ABAP CDS Time Functions 全面解析:用 TIMS_IS_VALID 护航时刻字段的正确性

摘要:本文深入解析ABAP CDS时间函数TIMS_IS_VALID的应用,重点介绍其在企业系统时间字段校验中的关键作用。文章指出无效时间数据会导致业务流程混乱,而CDS层校验能有效减少重复逻辑。详细说明TIMS类型格式要求、空值处理规则,并提供两种工程实现方案:在CDS视图中直接派生校验列,或通过ABAP SQL在内存表中批量验证。最后给出可直接运行的代码示例,包括一个ABAP报表演示内存表验证,以及一个CDS View Entity实现系统时间自动映射与校验,帮助开发者在业务场景中快速落地时间校验功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 193

Java9-反射(机制、ClassLoader、Annotation、代理设计)

1、认识反射机制 (1)概念 在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。 (2)功能 在运行时判断任意一个对象所属的类。 在运行时构造任意一个类的对象。 在运行时判断任意一个类所具有的成员变量和方法。 在运行时调用任意一个对象的方法。 生成动态代理。 (3)Class类对象的三种实例化模式 通过类名获取: 类名.class Class classa = null;

weixin_45176509的博客 455

lammps案例:聚乙烯和石墨烯界面pull out模拟

大家好,我是小马老师。 本文介绍lammps模拟计算界面结合力的一个案例。 本案例参考论文《The interfacial mechanical properties of functionalized graphene- polymer nanocomposites》,对论文作者表示感谢。 模型共分2层,上层为聚乙烯模型,下次为单层石墨烯,模拟过程共分3部分:建模、弛豫、拉伸。 (1)建模 使用MS建立聚乙烯和石墨烯模型,具体方法可参考之前的推文,使用build layer方法建立聚乙烯和石墨烯组合模型,

lammps_jiayou的博客 3494

JAVA自学笔记,Annotation注解

JDK1.5中开始增加了Annotation,它表示注解,它与之前学过的注释是不同的。Annotation是java.lang包下的一个接口,它是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理,它可用于类,构造方法,成员变量,方法,参数等的声明中,使用Annotation并不影响程序的运行,但是会对编译器警告等辅助工具产生影响。注解主要分为内置注解和自定义注解两种。 ...

Lxxx_H的博客 367

10.28华为OD机试真题 新系统 - AI推理任务并行额度最大值 (Java/Py/C/C++/Js/Go)

10.28华为OD机试真题 新系统 - AI推理任务并行额度最大值 (Java/Py/C/C++/Js/Go)

算法大师! 281

AI测试:手把手教你用AI创建流程图「喂饭教程」

本文介绍了如何利用next-ai-draw-io开源项目,通过AI快速生成专业流程图,提升测试工作效率。该工具支持自然语言交互,兼容多种AI模型(如OpenAI、Claude等),并集成draw.io图表引擎,实现实时编辑。

blues_C的博客 758

关于注解和反射

注解和反射 什么是注解(Annotation) Annotation 是 从 JDK5.0 开始引进的新技术 ,(2019 年 就 12了) Annotation的作用 : 1. 不是程序本身,可以对程序作出解释. (这一点和注释(comment)没什么区别) 2. 可以被其他程序(比如 编译器)读取 Annotation 的格式 - ​ 注解是以"@ 注释名" 在代码中存在的 ,还可以添加一些参数值, 例如 - ​

qq_48888791的博客 198

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析 1 2

本关任务:从文件user.txt中读取用户信息,包括账号、密码、联系方式等,创建一个用户信息的顺序表,根据账号判断顺序表中是否存在当前用户。如果存在,则添加失败。否则,判断输入的用户信息中是否有非法输入,若有则添加失败,否则将该用户作为新结点,按顺序插入到顺序表的相应位置,并将用户顺序表写入user.txt中。本关任务:从文件user.txt中读取用户信息,存入顺序表中。输入待查找的用户账号,调用折半查找算法判断用户顺序表中是否存在该用户的账号信息。如果存在,则返回其在顺序表中的位置,说明查找成功;

m0_62222486的博客 4940

【Java学习笔记-基础篇】关于注解(annotation)编程

今天在看以前写的代码,发现自己对注解的了解还不是非常透彻,经常选择性就忽视了对注解实现的探究,遂查询资料学习了一下。

weixin_43742184的博客 249

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

全网最细java零基础学习就业课程教学之java基础篇19:Annotation注解的使用

大学生零基础java课程学习就业

weixin_43841075的博客 419

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Annotation注解

注解Annotation 通过使用Annotation,可以在不改变原有逻辑的情况下,嵌入一些补充的信息。 Annotation只有成员变量,没有方法,成员变量以无参的方法来定义,方法名为成员变量名,方法的返回值为成员变量的类型。java.lang.annotation.Annotation接口:这个接口是所有Annotation类型的父接口。 根据是否包含成员变量可将 分为两类: 标记Anno...

littleAusna的博客 2439

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java 注解(Annotation)--基础篇

1.Annotation的定义 注解(Annotation),也叫元数据,是一种代码级别的说明。 它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。 其实Annotation就是代码里的特殊标记,它们可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。 2.Annotation作用分类 编写文档:通过注解生成API文档(@Documented)...

会者定离,一期一祈 1685

java annotation详解_Java注解Annotation详解

从JDK5开始,Java增加了Annotation(注解),Annotation是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation,开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证、处理或者进行部署。Annotation提供了一种为程序元素(包、类、构造器、方法...

weixin_42525343的博客 5857

python 注解annotation_Annotation注解(一)- 基础

这篇博客,主要讲解关于注解的一些基本知识,包括注解的概念、分类、作用,常见注解的定义及其解析方式等。Annotation的概念1. 概念关于Annotation注解的概念,我们可以看下官方的解释:Annotations, a form of metadata;provide data about a program that is not part of the program itself.An...

weixin_39608526的博客 1657

程序员java注解Annotation学习

我们自定义注解时需要使用java内置的作用与其他注解的注解,以上有提到@Retention注解和@Target注解需要使用到两个枚举类,下面将两个枚举类作出简要说明。两个注解DbTable(标注表,图1),DbField(标注字段,图2),两个类User(测试bean,图3),AnnotationTest(测试类,图4)java注解是JDK5.0引入的一种注释机制,类,方法,变量,参数和包均可被标注,和javadoc不同的是,java标注通过反射获取标注的内容。(新建注解不指定则适用于所有类型)

程序员高级码农的博客 984

Java 基础 —— 注解 Annotation

简介 Annotation 是从 JDK 5.0 引入的。 注解使得我们可以以编译器验证的格式存储程序的额外信息。注解可以生成描述符文件,甚至是新的类定义,并且有助于减轻编写“样板”代码的负担。 比如,我们项目中常常使用的 lombok 包中的注解,@Data、@NoArgsConstructor、@AllArgsConstructor 等注解,大大简化了代码,省了很多操作。 基本注...

MichaelHH 734
上一篇: RedisTemplate设计理解
下一篇: JAVA泛型详解(上)
鸡蛋达芬奇
博客等级 码龄19年 24粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值