自定义注解开发

  1.开发一个注解类

    开发一个注解类的过程,非常类似于开发一个接口,只不过需要通过@interface关键字来声明

  2.使用元注解修饰注解的声明

    所谓的原注解是用来修饰注解声明的注释,可以控制被修饰的注解的特性。

    @Target

      用来声明被修饰的注解可以用在什么位置。

      可以在@Target的属性中设置Element Type类型的数组来指定可以使用的位置。

      如果不使用此原注解修饰,默认注解可以用在任意位置。

    @Retention

      用来声明被修饰的注释会被保留到什么阶段。

      可以在该注解的属性中通过RetentionPolicy类型的值来指定注释被保留到何时。

        (1)RetentionPolicy.SOURCE

            此注解将会被保留到源码阶段,java中,在编译过程中被删除。

            这种类型的注解通常是给编译器看的。

        (2)Retention Policy.CLASS

            此注解将会被保留到源码阶段和编译阶段,.java和.class中,在类加载的过程中被删除。

            这种类型的注解通常是给类加载器看的。

        (3)RetentionPolicy.RUNTIME

            此注解将会被保留在源码阶段、编译阶段和运行阶段,.java  .class和内存中的字节码中都会存在。

            这种类型的注解通常在运行阶段进行反射,控制程序运行过程。

         ***只有RUNTIME级别的注解才可以通过反射技术进行反射。

    @Documented

        用来声明被修饰注解是否要被文档提取工具提取到文档中。

        默认不提取

    @Inherited

        被修饰的注释是否具有继承性

        默认没有继承性

  3.为注解增加属性

    注解类中还可以有声明属性。

    为注解类声明属性的过程非常类似于接口定义方法。

    但要求,注解中的所有的属性必须是public的,可以显式声明,也可以不声明,不声明默认就是public的。

    注解中的属性只能是八种基本数据类型、String类型、Class类型、其他注解类型及以上类型的一维数组。

    注解中声明的属性 需要在使用注解时,为其赋值,赋值的方式就是在使用注解时,在注解后跟上一对小括号,在括号中通过  属性名=属性值   的方式指定属性的值

    也可以在声明注解时,在注解的属性后面通过default关键字,声明属性的默认值,这样一来,使用注解时不赋值,将会使用default默认值,当然也可以手动赋值,覆盖默认值。

    如果属性是一维数组类型,在传入的数组中,只有一个值,则包括数组的大括号也可以省略。

    如果注解的属性只有一个需要赋值,且该属性的名称叫做value,则在使用注解时,value==可以不写

反射注解

  1.反射注解的原理

    RetentionPolicy.RUNTIME级别的注解会保留到运行中,可以通过反射技术获取,从而可以根据是否有注解 或 注解属性值的不同来控制程序按照不同方式运行。

    以下反射相关的类型中都提供了反射注解的方法:

      类Class<T>、类Method、类FIeld、类Constructor<T>、类Package

    

  2.反射注解案例

  1. package cn.tedu.test;
  2.  
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7.  
  8. @Target(ElementType.TYPE)
  9. @Retention(RetentionPolicy.RUNTIME)
  10. @interface level{
  11. String value();
  12. }
  13.  
  14. @level("刑警")
  15. class Police{
  16. }
  17.  
  18. public class AnnoTest02 {
  19. public static void main(String[] args) {
  20. System.out.println("敬了个礼,您好,您超速了,罚款200元。。。");
  21. if(Police.class.isAnnotationPresent(level.class)){
  22. level anno = Police.class.getAnnotation(level.class);
  23. if("协警".equals(anno.value())){
  24. System.out.println("哥们少罚点,50块得了~~");
  25. }else if("交警".equals(anno.value())){
  26. System.out.println("哥们抽根烟,这是200块,收好我走人~~");
  27. }else if("刑警".equals(anno.value())){
  28. System.out.println("赶紧交钱走人,别查出 别的事。。。");
  29. }else{
  30. System.out.println("xxx");
  31. }
  32. }else{
  33. System.out.println("打一顿,扭送警察局。。");
  34. }
  35. }
  36. }

JAVA-注解(2)-自定义注解及反射注解的更多相关文章

  1. JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题

    项目的权限分配,采用的是RBAC的设计模式.后台配置权限的时候,需要获取到所有的权限因子. 不经让我想起YII框架的SRBAC模块,还有以前的一个ecshop改造系统的权限配置方式,都采用的是PHP的 ...

  2. 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】

    一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...

  3. java反射--注解的定义与运用以及权限拦截

    自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是 ...

  4. java注解和自定义注解的简单使用

    前言 在使用Spring Boot的时候,大量使用注解的语法去替代XML配置文件,十分好用. 然而,在使用注解的时候只知道使用,却不知道原理.直到需要用到自定义注解的时候,才发现对注解原理一无所知,所 ...

  5. java注解的自定义和使用

    小伙伴们.今天我们来说说注解.标志@ .针对java不同版本来说,注解的出现是在jdk1.5 但是在jdk1.5版本使用注解必须继续类的方法的重写,不能用于实现的接口中的方法实现,在jdk1.6环境下 ...

  6. [转]Java中实现自定义的注解处理器

    Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...

  7. 大数据JavaWeb之java基础巩固----Junit&反射&注解

    最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...

  8. 【JAVA】java注解的自定义和使用

    java注解概念 Java提供了一种原程序中的元素关联任何信息和任何数据的途径和方法 java注解介绍 常用注解 @Override:表示方法是重写的方法 @Deprecated:过时的方法 @Sup ...

  9. Java注解-元数据、注解分类、内置注解和自定义注解|乐字节

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...

随机推荐

  1. spring boot之actuator简介

    当我们的开发工作进入尾声,部署上线之后,对于一个程序而言,可能才刚刚开始,对程序的运行情况的监控要伴随着整个生命周期. 如果这个工作由程序员自己来开发,也未尝不可,但本着不重复制造轮子的思想,我们尽量 ...

  2. Python装饰器和回调函数

    1.装饰器 装饰器用来实现一种切面功能,即一些函数在调用前都必须实现的功能,比如用户是否登录,用户是否有权限这类需求,都很容易由装饰器来实现. import functools def log(fun ...

  3. java方法中Collection集合的基本使用与方法

    集合类的由来,对象用于封闭特有数据,对象多了需要存储,如果对象的个数不确定就使用集合容器进行存储. 集合特点:1.用于存储对象的容器.2.集合的长度是可变的.3.集合中不可以存储基本数据类型值. 集合 ...

  4. 设计模式之单例模式的几种写法——java

    对于设计模式的使用场景和好处,之前有介绍一篇,今天主要是单例模式的编写方式,直接看代码吧 单例模式之饿汉模式,不会懒加载.线程安全 /** * @Author wangtao * @Descripti ...

  5. Day1_Python学习

    内容目录 1.变量和常量 2.用户输入 3.getpass模块 4.表达式if...else 5.表达式while 6.表达式for 一.变量和常量 声明变量: name = "Jeffer ...

  6. 【LEETCODE】32、LeetCode的第35题,查找插入的位置

    凉凉,看来想做好一个题还不容易啊... 有点难受... 1.看看题目吧 Given a sorted array and a target value, return the index if the ...

  7. 【入门】WebRTC知识点概览 | 内有技术干货免费下载

    什么是WebRTC WebRTC 即Web Real-Time Communication(网页实时通信)的缩写,是一个支持网页浏览器之间进行实时数据传输(包括音频.视频.数据流)的技术.经过多年的发 ...

  8. Python 3网络爬虫开发实战》中文PDF+源代码+书籍软件包

    Python 3网络爬虫开发实战>中文PDF+源代码+书籍软件包 下载:正在上传请稍后... 本书书籍软件包为本人原创,在这个时间就是金钱的时代,有些软件下起来是很麻烦的,真的可以为你们节省很多 ...

  9. mac-VBox-Centos6.6安装增强功能

    1. 更新内核 yum update kernel 2.安装依赖包 yum install kernel-headers yum install kernel-devel yum install gc ...

  10. UVALive 6255:Kingdoms(状压DFS)

    题目链接 题意 给出n个王国和n*n的矩阵,mp[i][j] 代表第 i 个王国欠第 j 个王国 mp[i][j] 块钱.如果当前的王国处于负债状态,那么这个王国就会被消除,和它相连的王国的债务都会被 ...