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

注解的语法比较简单,除了@符号的使用之外,它基本与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<Integer> useCases = new ArrayList<Integer>();Collections.addAll(useCases, 47, 48, 49, 50);trackUseCases(useCases, PasswordUtils.class);}public static void trackUseCases(List<Integer> 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

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

写到这里博主想到结合枚举、注解、反射、拦截器等内容,是否可以写一套用户权限验证呢?

将用户权限用枚举的方式给出,注解元素表明某个方法必须拥有某些权限才能调用,拦截器拦截请求方法,用户是否有权限对该方法进行调用,根据用户不同的权限进行不同的处理。欢迎讨论!

转载于:https://www.cnblogs.com/yaowen/p/4832602.html

java中注解的使用与实例(一)相关推荐

  1. java中注解的使用与实例 (二)

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  2. Java中注解学习系列教程-2

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

  3. java线程和内核线程的,Java中内核线程理论及实例详解

    1.概念 内核线程是直接由操作系统内核控制的,内核通过调度器来完成内核线程的调度并负责将其映射到处理器上执行.内核态下的线程执行速度理论上是最高的,但是用户不会直接操作内核线程,而是通过内核线程的接口 ...

  4. java中List的用法和实例详解

    Java中List的用法和实例详解 List的用法 List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提 ...

  5. java中注解的使用_java中注解的使用

    使用过ssh框架的人一定也使用过注解,尤其是在spring框架中,注解可谓是spring容器和AOP编程的重要环节.注解就是用于修饰类.全局变量.方法.参数或局部变量的接口,java中规定,注解的使用 ...

  6. JAVA中注解controller_SpringMVC之基于注解的Controller

    参考博客:https://www.cnblogs.com/qq78292959/p/3760560.html Controller注解: 传统风格的Controller需要实现Controller接口 ...

  7. Java中注解学习系列教程-1

    前言: 我们为什么要学习注解? 注解是我们的编程更简洁明了.spring boot的流行也带动了注解.spring boot中就使用了大量的注解来减少配置.我们在使用spring boot开发时候,感 ...

  8. Java中注解与反射的使用方法及场景,强行解释一波!

    作者:BudingCode blog.csdn.net/m0_55221239/article/details/115025182 注解 注解定义 Java 注解(Annotation)又称 Java ...

  9. java中注解操作redis_spring boot —— redis 缓存注解使用教程

    spring boot -- redis 缓存注解使用教程 依赖 在pom文件添加如下依赖 org.springframework.boot spring-boot-starter-data-redi ...

最新文章

  1. 使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析
  2. 框架模式与设计模式之区别
  3. 了解Android Matrix转换
  4. 《UNIX网络编程 卷2:进程间通信(第2版)》——1.4 名字空间
  5. Atitit 嵌入式系统与pc系统的对比 目录 1. 哈佛结构和冯诺依曼结构 普林斯顿结构区 1 2. 中断程序 类库调用 1 3. 指令集 三大流程语句 与 运算语句 赋值语句 1 4. 异
  6. 【优化算法】多目标粘菌算法(MOSMA)【含Matlab源码 1597期】
  7. 御剑+php,ps创意制作一个御剑飞行效果教程
  8. 自学iOS开发系列----UI(视图编程入门:UITabBarController)
  9. CSS中的边框与内边距外边距
  10. 使用CAPL 内置函数 memcpy 和memcmp 处理数组的若干问题
  11. 在西雅图华盛顿大学 (University of Washington) 就读是怎样一番体验?
  12. Android Snackbar基本使用
  13. HTML5音乐播放器的收获体会,音乐课的收获和心得【两篇】
  14. Qt 学习:comboBox编程时使用currentIndexChanged老是出现 assert failure错误
  15. java产生随机数的三种方式
  16. 双线双IP(多线多IP)域名智能解析教程
  17. python Huffman编码及解码
  18. 线性回归之梯度下降详解
  19. 【R-CNN】Rich feature hierarchies for accurate object detection and semantic segmentation (2014) 全文翻译
  20. android应用被系统回收,如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?...

热门文章

  1. PAL/NTSC/SECAM,这是全球现行的三种模拟技术彩色电视的制式
  2. VC++ 读取和保存文件对话框及默认目录
  3. 带CheckBox的CListCtrl,源码可下载
  4. el-table列宽自适应;el-table表格的列根据内容自动撑满;el-table内容换行问题;
  5. nuc972的ramfs的配置yaffs2,ubi文件系统
  6. [react] react的函数式组件有没有生命周期?
  7. React开发(204):react代码分割之路由懒加载
  8. React开发(102):别写立即执行函数
  9. 前端学习(2962):前一天回顾
  10. [html] 如何判断用户正在操作页面?当页面一个小时没有操作时跳转到指定页面如何做?