注解目前非常的流行,很多主流框架都支持注解,而且自己编写代码的时候也会尽量的去用注解,一时方便,而是代码更加简洁。

注解的语法比较简单,除了@符号的使用之外,它基本与Java固有语法一致。Java SE5内置了三种标准注解:

@Override,表示当前的方法定义将覆盖超类中的方法。

@Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。

@SuppressWarnings,关闭不当编译器警告信息。

上面这三个注解多少我们都会在写代码的时候遇到。Java还提供了4中注解,专门负责新注解的创建。

@Target

表示该注解可以用于什么地方,可能的ElementType参数有:

CONSTRUCTOR:构造器的声明

FIELD:域声明(包括enum实例)

LOCAL_VARIABLE:局部变量声明

METHOD:方法声明

PACKAGE:包声明

PARAMETER:参数声明

TYPE:类、接口(包括注解类型)或enum声明

@Retention

表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:

SOURCE:注解将被编译器丢弃

CLASS:注解在class文件中可用,但会被VM丢弃

RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。

@Document

将注解包含在Javadoc中

@Inherited

允许子类继承父类中的注解

定义一个注解的方式:

1 @Target(ElementType.METHOD)

2 @Retention(RetentionPolicy.RUNTIME)

3 public @interface Test {

4

5 }

除了@符号,注解很像是一个接口。定义注解的时候需要用到元注解,上面用到了@Target和@RetentionPolicy,它们的含义在上面的表格中已近给出。

在注解中一般会有一些元素以表示某些值。注解的元素看起来就像接口的方法,唯一的区别在于可以为其制定默认值。没有元素的注解称为标记注解,上面的@Test就是一个标记注解。

注解的可用的类型包括以下几种:所有基本类型、String、Class、enum、Annotation、以上类型的数组形式。元素不能有不确定的值,即要么有默认值,要么在使用注解的时候提供元素的值。而且元素不能使用null作为默认值。注解在只有一个元素且该元素的名称是value的情况下,在使用注解的时候可以省略“value=”,直接写需要的值即可。

下面看一个定义了元素的注解。

1 @Target(ElementType.METHOD)

2 @Retention(RetentionPolicy.RUNTIME)

3 public @interface UseCase {

4 public String id();

5 public String description() default "no description";

6 }

定义了注解,必然要去使用注解。

1 public class PasswordUtils {

2 @UseCase(id = 47, description = "Passwords must contain at least one numeric")

3 public boolean validatePassword(String password) {

4 return (password.matches("\\w*\\d\\w*"));

5 }

6

7 @UseCase(id = 48)

8 public String encryptPassword(String password) {

9 return new StringBuilder(password).reverse().toString();

10 }

11 }

使用注解最主要的部分在于对注解的处理,那么就会涉及到注解处理器。

从原理上讲,注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理。

public static void main(String[] args) {

List useCases = new ArrayList();

Collections.addAll(useCases, 47, 48, 49, 50);

trackUseCases(useCases, PasswordUtils.class);

}

public static void trackUseCases(List useCases, Class> cl) {

for (Method m : cl.getDeclaredMethods()) {

UseCase uc = m.getAnnotation(UseCase.class);

if (uc != null) {

System.out.println("Found Use Case:" + uc.id() + " "

+ uc.description());

useCases.remove(new Integer(uc.id()));

}

}

for (int i : useCases) {

System.out.println("Warning: Missing use case-" + i);

}

}

Found Use Case:47 Passwords must contain at least one numeric

Found Use Case:48 no description

Warning: Missing use case-49

Warning: Missing use case-50

上面的三段代码结合起来是一个跟踪项目中用例的简单例子。

注解 java 原理_Java注解基本原理相关推荐

  1. 注解 java 反射_java注解和反射

    2020-05-19 注解的作用: 不是程序本身,可以对程序做出解释,和注释有相似之处. 可以被其他程序(如编译器)所读取. 注解的格式:以"@注解名"在代码上存在,还可以在其中添 ...

  2. java注解使用变量_java注解的使用

    java中注解的使用 1.说再前面 使用注解开发的好处 1.使代码更加干净易读,易于维护修改.比如,以前使用spring的开发,都是基于xml文件实现了统一的配置管理,但是缺点也是显而易见的,就是随着 ...

  3. java注解详解_Java注解详解

    Annotation是从JDK5.0开始引入的新技术. Annotation的作用:–不是程序本身,可以对程序作出解释.(这一点,跟注释没什么区别)–可以被其他程序(比如:编译器等)读取.(注解信息处 ...

  4. java注解的反射_Java注解与反射

    概要 本文主要是总结Java注解与反射的相关知识,加深自己对Java类动态语言的理解,同时为日后学习Spring打下基础. 注解: 什么是注解 Annotation的作用 不是程序本身,但是可以对程序 ...

  5. java 注解与反射_Java注解与反射直接上手

    什么是注解(Annotation) 注解顾名思义为注释.讲解,可以理解为一种标签或标记,可以用在类.方法或者域上.向类.方法等添加注解,相当于给他们贴上了一层标签. 注解使用 在使用注解时,在类名.方 ...

  6. java websocket原理_Java WebSocket基本原理

    WebSocket协议介绍 WebSocket协议是一个网络协议,允许两个相连的端在一个单一TCP连接上进行全双工消息通信. 在WebSocket的场景中,连接通过HTTP和WebSocket端点交互 ...

  7. JAVA注解行_java注解

    注释 单行注释 // 多行注释 /*  */ 文档注释/**  */ 注解 Annotation(注释 注解) 1.注解的写法 @XXX[(一些信息)] 2.注解放置在哪里 类的上面:属性上面:方法上 ...

  8. java注解怎么写_java注解

    写在前面 现在的java主流框架中,注解无处不在,因此我们完全有必要搞明白注解到底是什么.如何理解注解,它到底是怎么起作用的. 注解的定义 java是这样定义注解的:Java 注解用于为 Java 代 ...

  9. java 注解报错_java注解验证接收参数 返回注解字段的错误

    1.在controller接口方法接收参数加上 @Valid注解 并且在实体类参数后紧跟 BindingResult bindingresul BindingResultMsgUtil工具类: pub ...

最新文章

  1. 菜鸟,大牛,教主的区别
  2. 分支-03. 三天打鱼两天晒网(Switch…case)
  3. myeclipse中的js文件报错
  4. AWGN和Rayleigh信道下QPSK的误码率分析
  5. 8种常用图像处理算法
  6. echarts中x轴文字过长换行处理和倾斜处理。
  7. 西安电子科技大学求职打点
  8. Quartz使用总结(转)
  9. 一元钱一瓶汽水,喝完后两个空瓶能换一瓶汽水,问:你有20元钱,可以喝到几瓶汽水?
  10. r语言把两个折线图图像放到一个图里_OpenCV计算机视觉学习(10)——图像变换(傅里叶变换,高通滤波,低通滤波)...
  11. 房产行业数字化转型迷思:技术能提供何种助力?
  12. 1146: 5004 周易
  13. meso-四(4-烷氨基甲酰苯基)卟啉(AFPP);5-(4-氨基苯基)-10,15.20-三苯基卟啉(TPP-NH2);5,10,15,20-四吡啶基苯基卟啉(H2TPyP)齐岳供应
  14. 为什么react选择了函数式组件(剖析原理)
  15. 第三课支路分析分析法与结点电位分析法
  16. 面试常见问题之adb命令
  17. OpManager 网络管理软件
  18. 杭州java好找工作吗_【java】我是学java的应届毕业生,来杭州一个多星期了,还没找到工作,能指点...
  19. 中国电信5G NB-IoT用户规模破1亿 5G窄带物联网规模全球第一
  20. 通达信交易接口如何确保数据的完整性的?

热门文章

  1. python后台——aiohttp入门
  2. 结构数组-创建结构数组---获取修改结构数组数据-------操作字段
  3. 汇编:在BUFFER中定义了的十个带符号字,将其中的负数变成绝对值,并以十进制方式输出
  4. html上传视频文件前端显示,文件分片上传之前端文件分片
  5. Sublime Text 2 快捷键用法大全(转)
  6. [SVN] 分支同步、合入主干操作分享
  7. vs下qt的信号与槽实现
  8. poj 1426 Find The Multiple (简单搜索dfs)
  9. Mysql自动设置时间(自动获取时间,填充时间)
  10. 阿里云cenos 6.5 模板上安装 docker