自定义注解开发

  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.反射注解案例

 package cn.tedu.test;

 import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface level{
String value();
} @level("刑警")
class Police{
} public class AnnoTest02 {
public static void main(String[] args) {
System.out.println("敬了个礼,您好,您超速了,罚款200元。。。");
if(Police.class.isAnnotationPresent(level.class)){
level anno = Police.class.getAnnotation(level.class);
if("协警".equals(anno.value())){
System.out.println("哥们少罚点,50块得了~~");
}else if("交警".equals(anno.value())){
System.out.println("哥们抽根烟,这是200块,收好我走人~~");
}else if("刑警".equals(anno.value())){
System.out.println("赶紧交钱走人,别查出 别的事。。。");
}else{
System.out.println("xxx");
}
}else{
System.out.println("打一顿,扭送警察局。。");
}
}
}

最新文章

  1. 客户端GUI程序开发漫谈
  2. Redis简介
  3. [BZOJ2423][HAOI2010]最长公共子序列
  4. Sqoop实现自定义job的增量导入
  5. sysfs-&gt;sys简单介绍
  6. iOS 9 适配
  7. oracle函数之replace
  8. 介绍一款开源的类Excel电子表格软件
  9. vue数据驱动作用域问题
  10. js选中文字兼容性解决
  11. PXE+kickstart网络安装CentOS7.4系统及过程中各种报错
  12. Linux 桌面玩家指南:11. 在同一个硬盘上安装多个 Linux 发行版以及为 Linux 安装 Nvidia 显卡驱动
  13. Python反射机制理解
  14. 关于Unity中的Mesh Collider碰撞器
  15. Andrew Ng-ML-第十四章-无监督学习
  16. Facebook广告API系列 3 Ads Management
  17. [UE4]关闭自动曝光
  18. apache的错误日志分析
  19. oc 代码块的使用
  20. Phpstorm Alt+Enter 自动导入类

热门文章

  1. Redis EXISTS命令耗时过长case排查
  2. vue-cli脚手架 ,过滤器,生命周期钩子函数
  3. 管理python虚拟环境的工具virtuelenvwrapper
  4. Adobe cs6 全系列软件绿色破解版-一键安装
  5. 剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染
  6. 【需要重新维护】Redis笔记20170811视频
  7. TCP11种状态集之TIME_WAIT
  8. 机器学习经典算法之Apriori
  9. C++ 洛谷 P2458 [SDOI2006]保安站岗 from_树形DP
  10. tensorflow学习笔记(1)-环境配置