1、Annotation的工作原理:

JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的class文件和一个注解处理工具组成。

Annotation并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。它会反过来对正在运行的程序语义有所影响。

Annotation可以冲源文件、class文件或者在运行时通过反射机制多种方式被读取。

2、@Override注解:

java.lang

注释类型 Override

@Target(value=METHOD)

@Retention(value=SOURCE)

public @interface Override

表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。

@Override注解表示子类要重写父类的对应方法。

Override是一个Marker annotation,用于标识的Annotation,Annotation名称本身表示了要给工具程序的信息。

下面是一个使用@Override注解的例子:

class A {

private String id;

A(String id){

this.id = id;

}

@Override

public String toString() {

return id;

}

}

3、@Deprecated注解:

java.lang

注释类型 Deprecated

@Documented

@Retention(value=RUNTIME)

public @interface Deprecated

用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。

@Deprecated注解表示方法是不被建议使用的。

Deprecated是一个Marker annotation。

下面是一个使用@Deprecated注解的例子:

class A {

private String id;

A(String id){

this.id = id;

}

@Deprecated

public void execute(){

System.out.println(id);

}

public static void main(String[] args) {

A a = new A("a123");

a.execute();

}

}

4、@SuppressWarnings注解:

java.lang

注释类型 SuppressWarnings

@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})

@Retention(value=SOURCE)

public @interface SuppressWarnings

指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。注意,在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集。例如,如果注释一个类来取消显示某个警告,同时注释一个方法来取消显示另一个警告,那么将在此方法中同时取消显示这两个警告。

根据风格不同,程序员应该始终在最里层的嵌套元素上使用此注释,在那里使用才有效。如果要在特定的方法中取消显示某个警告,则应该注释该方法而不是注释它的类。

@SuppressWarnings注解表示抑制警告。

下面是一个使用@SuppressWarnings注解的例子:

@SuppressWarnings("unchecked")

public static void main(String[] args) {

List list = new ArrayList();

list.add("abc");

}

5、自定义注解:

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。

自定义最简单的注解:

public @interface MyAnnotation {

}

使用自定义注解:

public class AnnotationTest2 {

@MyAnnotation

public void execute(){

System.out.println("method");

}

}

5.1、添加变量:

public @interface MyAnnotation {

String value1();

}

使用自定义注解:

public class AnnotationTest2 {

@MyAnnotation(value1="abc")

public void execute(){

System.out.println("method");

}

}

当注解中使用的属性名为value时,对其赋值时可以不指定属性的名称而直接写上属性值接口;除了value意外的变量名都需要使用name=value的方式赋值。

5.2、添加默认值:

public @interface MyAnnotation {

String value1() default "abc";

}

5.3、多变量使用枚举:

public @interface MyAnnotation {

String value1() default "abc";

MyEnum value2() default MyEnum.Sunny;

}

enum MyEnum{

Sunny,Rainy

}

使用自定义注解:

public class AnnotationTest2 {

@MyAnnotation(value1="a", value2=MyEnum.Sunny)

public void execute(){

System.out.println("method");

}

}

5.4、数组变量:

public @interface MyAnnotation {

String[] value1() default "abc";

}

使用自定义注解:

public class AnnotationTest2 {

@MyAnnotation(value1={"a","b"})

public void execute(){

System.out.println("method");

}

}

6、设置注解的作用范围:

@Documented

@Retention(value=RUNTIME)

@Target(value=ANNOTATION_TYPE)

public @interface Retention

指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。

只有元注释类型直接用于注释时,Target 元注释才有效。如果元注释类型用作另一种注释类型的成员,则无效。

public enum RetentionPolicy

extends Enum

注释保留策略。此枚举类型的常量描述保留注释的不同策略。它们与 Retention 元注释类型一起使用,以指定保留多长的注释。

CLASS

编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。

RUNTIME

编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

SOURCE

编译器要丢弃的注释。

@Retention注解可以在定义注解时为编译程序提供注解的保留策略。

属于CLASS保留策略的注解有@SuppressWarnings,该注解信息不会存储于.class文件。

6.1、在自定义注解中的使用例子:

@Retention(RetentionPolicy.CLASS)

public @interface MyAnnotation {

String[] value1() default "abc";

}

7、使用反射读取RUNTIME保留策略的Annotation信息的例子:

java.lang.reflect

接口 AnnotatedElement

所有已知实现类:

AccessibleObject, Class, Constructor, Field, Method, Package

表示目前正在此 VM 中运行的程序的一个已注释元素。该接口允许反射性地读取注释。由此接口中的方法返回的所有注释都是不可变并且可序列化的。调用者可以修改已赋值数组枚举成员的访问器返回的数组;这不会对其他调用者返回的数组产生任何影响。

如果此接口中的方法返回的注释(直接或间接地)包含一个已赋值的 Class 成员,该成员引用了一个在此 VM 中不可访问的类,则试图通过在返回的注释上调用相关的类返回的方法来读取该类,将导致一个 TypeNotPresentException。

isAnnotationPresent

boolean isAnnotationPresent(Class extends Annotation> annotationClass)

如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。此方法主要是为了便于访问标记注释而设计的。

参数:

annotationClass - 对应于注释类型的 Class 对象

返回:

如果指定注释类型的注释存在于此对象上,则返回 true,否则返回 false

抛出:

NullPointerException - 如果给定的注释类为 null

从以下版本开始:

1.5

getAnnotation

T getAnnotation(Class annotationClass)

如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。

参数:

annotationClass - 对应于注释类型的 Class 对象

返回:

如果该元素的指定注释类型的注释存在于此对象上,则返回这些注释,否则返回 null

抛出:

NullPointerException - 如果给定的注释类为 null

从以下版本开始:

1.5

getAnnotations

Annotation[] getAnnotations()

返回此元素上存在的所有注释。(如果此元素没有注释,则返回长度为零的数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

返回:

此元素上存在的所有注释

从以下版本开始:

1.5

getDeclaredAnnotations

Annotation[] getDeclaredAnnotations()

返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

返回:

直接存在于此元素上的所有注释

从以下版本开始:

1.5

下面是使用反射读取RUNTIME保留策略的Annotation信息的例子:

自定义注解:

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation {

String[] value1() default "abc";

}

使用自定义注解:

public class AnnotationTest2 {

@MyAnnotation(value1={"a","b"})

@Deprecated

public void execute(){

System.out.println("method");

}

}

读取注解中的信息:

public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {

AnnotationTest2 annotationTest2 = new AnnotationTest2();

//获取AnnotationTest2的Class实例

Class c = AnnotationTest2.class;

//获取需要处理的方法Method实例

Method method = c.getMethod("execute", new Class[]{});

//判断该方法是否包含MyAnnotation注解

if(method.isAnnotationPresent(MyAnnotation.class)){

//获取该方法的MyAnnotation注解实例

MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);

//执行该方法

method.invoke(annotationTest2, new Object[]{});

//获取myAnnotation

String[] value1 = myAnnotation.value1();

System.out.println(value1[0]);

}

//获取方法上的所有注解

Annotation[] annotations = method.getAnnotations();

for(Annotation annotation : annotations){

System.out.println(annotation);

}

}

8、限定注解的使用:

限定注解使用@Target。

@Documented

@Retention(value=RUNTIME)

@Target(value=ANNOTATION_TYPE)

public @interface Target

指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。 例如,此元注释指示该声明类型是其自身,即元注释类型。它只能用在注释类型声明上:

@Target(ElementType.ANNOTATION_TYPE)

public @interface MetaAnnotationType {

...

}

此元注释指示该声明类型只可作为复杂注释类型声明中的成员类型使用。它不能直接用于注释:

@Target({})

public @interface MemberType {

...

}

这是一个编译时错误,它表明一个 ElementType 常量在 Target 注释中出现了不只一次。例如,以下元注释是非法的:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})

public @interface Bogus {

...

}

public enum ElementType

extends Enum

程序元素类型。此枚举类型的常量提供了 Java 程序中声明的元素的简单分类。

这些常量与 Target 元注释类型一起使用,以指定在什么情况下使用注释类型是合法的。

ANNOTATION_TYPE

注释类型声明

CONSTRUCTOR

构造方法声明

FIELD

字段声明(包括枚举常量)

LOCAL_VARIABLE

局部变量声明

METHOD

方法声明

PACKAGE

包声明

PARAMETER

参数声明

TYPE

类、接口(包括注释类型)或枚举声明

注解的使用限定的例子:

@Target(ElementType.METHOD)

public @interface MyAnnotation {

String[] value1() default "abc";

}

9、在帮助文档中加入注解:

要想在制作JavaDoc文件的同时将注解信息加入到API文件中,可以使用java.lang.annotation.Documented。

在自定义注解中声明构建注解文档:

@Documented

public @interface MyAnnotation {

String[] value1() default "abc";

}

使用自定义注解:

public class AnnotationTest2 {

@MyAnnotation(value1={"a","b"})

public void execute(){

System.out.println("method");

}

}

10、在注解中使用继承:

默认情况下注解并不会被继承到子类中,可以在自定义注解时加上java.lang.annotation.Inherited注解声明使用继承。

@Documented

@Retention(value=RUNTIME)

@Target(value=ANNOTATION_TYPE)

public @interface Inherited

指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。

注意,如果使用注释类型注释类以外的任何事物,此元注释类型都是无效的。还要注意,此元注释仅促成从超类继承注释;对已实现接口的注释无效。

java注解定义常量_java自定义注解相关推荐

  1. java注解获取参数_JAVA 自定义注解及参数获取 | 学步园

    package com.java.annotation; import java.lang.annotation.*; /** * Created by lw on 14-5-30. * 自定义注解 ...

  2. java自定义注解为空值_java自定义注解

    1. Java注解(Annotation) Java注解是附加在代码中的一些元信息,用于一些工具在编译. 运行时进行解析和使用,起到说明.配置的功能. 注解相关类都包含在java.lang.annot ...

  3. Java通过自定义注解执行方法_Java自定义注解(使用篇)

    TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...

  4. java自定义注解为空值_java 自定义注解

    转载自(https://www.cnblogs.com/liangweiping/p/3837332.html) 目录 1.通过自定义注解,进行赋值 2.通过自定义注解,进行校验 3.实际应用如何应用 ...

  5. java 自定义注解 解析_java自定义注解

    1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...

  6. java运行时读取注解_Java自定义注解和运行时靠反射获取注解

    转:1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰 ...

  7. 【Java注解系列】内置注解与AOP实现自定义注解

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制. Java 语言中的类.方法.变量.参数和包等都可以被标注.和 Javadoc 不同,Java 标注可 ...

  8. java定义常量_JAVA中定义常量方法

    JAVA中定义常量方法 (2013-01-28 14:30:19) 标签: it 一.常量定义的基本注意事项. 在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字) ...

  9. @data注解的作用_Java中注解学习系列教程-2

    在上一篇文章中,我们讲解了:Java中注解的定义.JDK中内置注解.第三方注解. 本文是注解系列教程中的第二篇.来看看今天主要内容: ​ 1:注解的分类 2:元注解说明 3:自定义注解声明 一:注解的 ...

最新文章

  1. 谷歌编程语言年度榜NO.1:知识体系总结(2021版)
  2. 给不爱洗手找个理由——皮肤共生菌可以促进伤口愈合
  3. C++ STL 之 map
  4. JRebel for Android 编译神器
  5. IOS CALayer
  6. win32应用程序_电脑打不开exe程序|Win10提示exe不是有效32应用程序
  7. java utf8转iso8859-1_在Java中将UTF-8转换为ISO-8859-1
  8. [原]Threads vs Processes in Linux 分析
  9. [css] 说说你对前端二倍图的理解?移动端使用二倍图比一倍图有什么好处?
  10. 辽宁412想学计算机科学技术,辽宁理工学院计算机科学与技术专业2016年在辽宁理科高考录取最低分数线...
  11. 华为云开天aPaaS 上线,服务千万开发者,使能行业场景化创新
  12. struts2+hibernate+spring配置详解
  13. Spring bean注入方式
  14. 进程与服务的签名_服务器被黑客攻击后如何查找溯源攻击
  15. 响应式网站导航html,jQuery和CSS3响应式网站导航幻灯片插件
  16. 用中位数代替平均数来衡量民生指标
  17. 51单片机交通灯(十字路口演示)
  18. 宅男福利:Python爬取某站所有漫画(赶紧收藏)
  19. vga焊接线顺序_VGA线的脚位定义和焊接方法
  20. 财务造假判断+面试+车牌识别

热门文章

  1. 国民技术N32L40X之IAP升级BootLoader程序
  2. 夏季十二星座程序猿最佳旅游地
  3. 配置及使用Zabbix监控系统:监控CPU 监控内存 监控进程 监控网络流量 监控硬盘
  4. 每日一记:windows官方桌面显示自定义文字软件BGInfo
  5. WEB视频聊天室/远程视频会议/远程教学系统/支持P2P
  6. 帆软报表-鼠标悬停改变背景色
  7. 人脸检测——MTCNN学习笔记
  8. 深入理解容器技术——聊聊服务容器化三大助力
  9. 大牛手把手教你!一起来聊聊Synchronized底层实现原理
  10. 【原理/Sentinel】RT降级策略原理