java自定义注解枚举_java_自定义注解「建议收藏」

1注解的定义和用途1.1官方描述Anannotationisaformofmetadata,thatcanbeaddedtoJavasourcecode.Classes,methods,variables,parametersandpackagesmaybeannotated.Annotationshavenodirecteffecton…

大家好,又见面了,我是你们的朋友全栈君。

1 注解的定义和用途

1.1 官方描述

An annotation is a form of metadata, that can be added to Java source code.

Classes, methods, variables, parameters and packages may be annotated.

Annotations have no direct effect on the operation of the code they annotate.

注解是一种可以被添加到java代码中的元数据,属于java的一种数据类型,和类、接口、数组、枚举类似

类、方法、变量、参数、包都可以使用注解来修饰

注解对于它所修饰的代码并没有直接影响

1.2 用途

Annotations have a number of uses, among them:

Information for the complier – Annotations can be used by the compiler to detect errors or suppress warnings.

Compiler-time and deployment-time processing – Software tools can process annotation information to generate code, XML files, and so forth.

Runtime processing – Some annotations are available to be examined at runtime.

为编译器提供信息:编译器可以使用注解来检测错误或抑制警告

编译时和部署时处理:软件工具能处理注解信息从而生成代码,XML文件等等

运行时处理:有些注解可在运行时进行检查

2 使用自定义注解

注解其实就是一种标记,可以在程序代码中的关键点(类、方法、变量、参数、包)上打上这些标记,程序在编译时或运行时可以检测到这些标记从而执行一些特殊的操作

基本步骤

定义注解

配置注解  把标记打在需要用到的代码中

解析注解  在编译时或运行时检测到标记,并进行特殊操作

2.1 定义注解

1 //@CherryAnnotation被限定只能使用在方法上面,运行时有效

2 @Retention(RetentionPolicy.RUNTIME)3 @Target(value ={ElementType.METHOD})4 public @interface CherryAnnotation { //使用关键字@interface

5 publicString name();6 int age() default 18;7 int[] array();8 }

注解类型的声明:使用关键字@interface,在底层实现上,所有定义的注解都会自动继承 java.lang.annotation.Annotation接口。

注解类型实现部分:只能定义注解类型元素

注解元素使用注意:

a.访问修饰符必须为public,不写默认为public;

b.该元素的类型只能是基本数据类型,String、Class、枚举类型、注解类型、数组;

c.元素名称一般定义为名词,如果注解中只有一个元素,可以把名字起为value

d.()仅仅只是一个特殊的语法,不能定义参数

e.default为默认值,必须和定义类型一致

f.如果没有默认值,代表后续使用注解时必须给改类型元素赋值

元注解:专门修饰注解的注解

@Target注解,是专门用来限定某个自定义注解能够被应用在哪些Java元素上面的。它使用一个枚举类型定义如下:

1 public enumElementType {2 /**类,接口(包括注解类型)或枚举的声明*/

3 TYPE,4

5 /**属性的声明*/

6 FIELD,7

8 /**方法的声明*/

9 METHOD,10

11 /**方法形式参数声明*/

12 PARAMETER,13

14 /**构造方法的声明*/

15 CONSTRUCTOR,16

17 /**局部变量声明*/

18 LOCAL_VARIABLE,19

20 /**注解类型声明*/

21 ANNOTATION_TYPE,22

23 /**包的声明*/

24 PACKAGE25 }

@Retention注解,用来修饰自定义注解的生命力。

注解的生命周期有三个阶段:1、Java源文件阶段;2、编译到class文件阶段;3、运行期阶段。RetentionPolicy枚举类型

1 public enumRetentionPolicy {2 /**

3 * Annotations are to be discarded by the compiler.4 * (注解将被编译器忽略掉)5 * 将被限定在Java源文件中,这个注解即不会参与编译也不会在运行期起任何作用,就和注释是一样的效果,只能被阅读Java文件的人看到;6 */

7 SOURCE,8

9 /**

10 * Annotations are to be recorded in the class file by the compiler11 * but need not be retained by the VM at run time. This is the default12 * behavior.13 * (注解将被编译器记录在class文件中,但在运行时不会被虚拟机保留,这是一个默认的行为)14 * 将被编译到Class文件中,编译器可以在编译时根据注解做一些处理动作,但是运行时JVM(Java虚拟机)会忽略它,我们在运行期也不能读取到;15 */

16 CLASS,17

18 /**

19 * Annotations are to be recorded in the class file by the compiler and20 * retained by the VM at run time, so they may be read reflectively.21 * (注解将被编译器记录在class文件中,而且在运行时会被虚拟机保留,因此它们能通过反射被读取到)22 * 注解可以在运行期的加载阶段被加载到Class对象中。在程序运行阶段,我们可以通过反射得到这个注解,并通过判断是否有这个注解或这个注解中属性的值,23 * 从而执行不同的程序代码段。我们实际开发中的自定义注解几乎都是使用的RetentionPolicy.RUNTIME;24 *@seejava.lang.reflect.AnnotatedElement25 */

26 RUNTIME27 }

@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中。

@Inherited注解,是指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。

2.2 配置注解  把标记打在需要用到的代码中

1 public classStudent {2 @CherryAnnotation(name = “cherry-peng”,age = 23,score = {99,66,77})3 public void study(inttimes){4 for(int i = 0; i < times; i++){5 System.out.println(“Good Good Study, Day Day Up!”);6 }7 }8 }

在定义的注解中,有些注解类型元素没有默认值,使用的时候需要在标记名后面加上(),并以“元素名1=元素值1,元素名2=元素值=2”的形式为元素赋值。(原有默认的会被覆盖)

2.3 解析注解  在编译时或运行时检测到标记,并进行特殊操作

只有当注解的保持力处于运行阶段,即使用@Retention(RetentionPolicy.RUNTIME)修饰注解时,才能在JVM运行时,检测到注解,并进行一系列特殊操作。

反射操作获取注解

public classTestAnnotation {public static voidmain(String[] args){try{//获取Student的Class对象

Class stuClass = Class.forName(“pojos.Student”);//说明一下,这里形参不能写成Integer.class,应写为int.class

Method stuMethod = stuClass.getMethod(“study”,int.class);//判断该元素上是否配置有某个指定的注解

if(stuMethod.isAnnotationPresent(CherryAnnotation.class)){

System.out.println(“Student类上配置了CherryAnnotation注解!”);//获取该元素上指定类型的注解

CherryAnnotation cherryAnnotation = stuMethod.getAnnotation(CherryAnnotation.class);

System.out.println(“name: ” + cherryAnnotation.name() + “, age: ” +cherryAnnotation.age()+ “, score: ” + cherryAnnotation.score()[0]);

}else{

System.out.println(“Student类上没有配置CherryAnnotation注解!”);

}

}catch(ClassNotFoundException e) {

e.printStackTrace();

}catch(NoSuchMethodException e) {

e.printStackTrace();

}

}

}//getAnnotations(),该方法可以获得该对象身上配置的所有的注解,返回Annotation类型数组

特殊语法

1.如果注解本身没有注解类型元素,在使用注解的时候可以省略(),直接写为:@注解名,它和标准语法@注解名()等效

1 @Retention(RetentionPolicy.RUNTIME)2 @Target(value ={ElementType.TYPE})3 @Documented4 public @interfaceFirstAnnotation {5 }6 ————————————

7 //等效于@FirstAnnotation()

8 @FirstAnnotation9 public classJavaBean{10 //省略实现部分

11 }

2.如果注解本本身只有一个注解类型元素,而且命名为value,在使用注解的时候可以直接使用:@注解名(注解值),其等效于:@注解名(value = 注解值)

@Retention(RetentionPolicy.RUNTIME)

@Target(value={ElementType.TYPE})

@Documentedpublic @interfaceSecondAnnotation {

String value();

}————————————

//等效于@ SecondAnnotation(value = “this is second annotation”)

@SecondAnnotation(“this is annotation”)public classJavaBean{//省略实现部分

}

3.如果某个注解类型元素是一个数组类型,在使用时又只需要填入一个值的情况,在使用注解时可以直接写为:@注解名(类型名 = 类型值),它和标准写法:@注解名(类型名 = {类型值})等效

@Retention(RetentionPolicy.RUNTIME)

@Target(value={ElementType.TYPE})

@Documentedpublic @interfaceThirdAnnotation {

String[] name();

}————————————–

//等效于@ ThirdAnnotation(name = {“this is third annotation”})

@ ThirdAnnotation(name = “this is third annotation”)public classJavaBean{//省略实现部分

}

4.如果一个注解的@Target是定义为Element.PACKAGE,这个注解是配置在package-info.java中的,而不能直接在某个类的package代码上面配置。

Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。

作用在代码的注解是

1 @Override -检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。2 @Deprecated -标记过时方法。如果使用该方法,会报编译警告。3 @SuppressWarnings -指示编译器去忽略注解中声明的警告。4 作用在其他注解的注解(或者说 元注解)是:5 @Retention -标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。6 @Documented -标记这些注解是否包含在用户文档中。7 @Target -标记这个注解应该是哪种 Java 成员。8 @Inherited -标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)9 从 Java 7 开始,额外添加了 3个注解:10 @SafeVarargs – Java 7开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。11 @FunctionalInterface – Java 8开始支持,标识一个匿名函数或函数式接口。12 @Repeatable – Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129209.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Docker 导出/导入镜像[通俗易懂]

    Docker 导出/导入镜像[通俗易懂]如果服务器网络不好或者pull不下来镜像,只能在其它网络比较好的机器上pull下来镜像,导出成一个文件,再下载上传到网络不好的机器上,然后再从文件中导出来,这样在网络不好的机器上也能使用docker镜像了。1、导出镜像首先使用dockerimages查看本机镜像,找到他的镜像id,如图所示:然后执行以下命令通过镜像id导出镜像到宿主机$dockersav…

    2022年9月6日
    7
  • 黑盒测试c语言用例,黑盒测试用例设计技术包括_测试用例包括什么_常用黑盒测试用例设计(4)…

    黑盒测试c语言用例,黑盒测试用例设计技术包括_测试用例包括什么_常用黑盒测试用例设计(4)…因此,可以把全部输入数据合理地划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,这样就可以用少量的代表性测试数据,来取得较好的测试结果。黑盒测试用例设计技术包括*是指对于程序的规格说明来说,是合理的有意义的输入数据构成的集合。利用它可以检验程序是否实现预先规定的功能和性能。在具体问题中,有效等价类可以是一个,也可以是多个。有效等价类*是指对于程序的规格说明…

    2022年6月13日
    34
  • pytest重试_pytest不是内部或外部命令

    pytest重试_pytest不是内部或外部命令安装:pip3installpytest-rerunfailures重新运行所有失败用例要重新运行所有测试失败的用例,请使用–reruns命令行选项,并指定要运行测试的最大次数:$py

    2022年7月31日
    7
  • C语言中volatile关键字的作用

    C语言中volatile关键字的作用一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变

    2022年6月1日
    34
  • C语言中的选择排序

    C语言中的选择排序文章目录前言一、选择排序1.计算素组元素个数2.选择排序基本逻辑(例子是从大到小排列)3.具体实现1.外层循环:决定大回合个数每个大回合决出一个席位2.内层循环:决定小回合个数每个小回合进行1V1大战实力强的为擂主直至最后一位挑战者3.两个元素值的交换总结前言在C语言中用来解决排序问题的常见方法有选择排序和冒泡排序两种一、选择排序先上代码:1.计算素组元素个数通过sizeof()计算数组全体元素占空间的大小再去除以一个元素占空间的大小即可得到元素个数。2.选择排序基本

    2022年6月25日
    22
  • 自定义过滤器及标签

    自定义过滤器及标签

    2021年7月3日
    83

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号