一.什么是注解

annotation是注解的意思 ,注解可以理解为标记,用来标记一些辅助信息。

其实呢,Java中有一类接口 本身不用被实现,只是作为一个标记用的存在。

标记的目的显然是为了进行  区别,识别,分类,这样做的目的 就明显了,分类之后可以制定统一的规则来进行处理。处理的依据就是注解里面含有的信息.

那么注解本身就是一个标记,可以用于分类,从而使用注解可以  获取一个 类的集合或者是一个方法的集合..

从而为我们下一步的处理提供一个输入集合,可以让我们以一个高度统一的动作来处理一些  同一个标记的 对象

领悟其中的精髓:  标记,分类,储存辅助信息.

有了这个标记,我们可以使用反射来分析类,然后进行归类,(aop 的切点不也是为了进行归类吗),

辅助的信息其实就是可以放到配置文件中的那些配置信息,这些东西的灵活配置增加了灵活度,因此注解里面可以放置一些固定的信息

有了这些 作用,那么就可以依据注解里面的配置信息 对注解修饰的  东西 (类,对象,字段,方法)  进行一些处理。

比如  : 校验 ,我们可以在VO的字段上加上注解来存储校验的规则信息,当然这些规则只是固定的验证规则而已

导入/导出 ,可以在vo中的字段加上该字段将是excel中的第几列,有什么格式化的规则等等

aop:使用特定的主键可以作为一个拦截标志,然后配合注解中的固定信息给出拦截器处理的动作功能,

如计算方法的执行时间,方法的输入参数打印,事务管理等

二.使用方法

       2.1 定义

            注解是一个接口,使用如下的方式进行这个接口的定义

                public @interface 注解名称

           例如  public @interface FieldInfo


          2.2注解的使用范围

          可以使用  元 注解来修饰我们定义的注解
@Retention  和  @Target
可以参考API里面  关于这两个注解的取值都有哪些.
           
         例如:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface FieldInfo {                  String value() default "";
}

           2.2.1 @Retention:修饰注解的有效期

            该注解的取值是一个RetentionPolicy的枚举
            其中的RetentionPolicy的取值有:    我们往往是要在程序运行的时候获取注解的值,因此使用  RUNTIME的时候比较多
public enum RetentionPolicy {               SOURCE,             CLASS,              RUNTIME
}
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候
          用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中
          用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时

          2.2.2 @Target 注解应用在哪些对象上

          该注解的取值是一个ElementType的数组  ElementType[]   
           其中的ElementType的取值有:
 

public enum ElementType {     TYPE,       FIELD,      METHOD,     PARAMETER,      CONSTRUCTOR,        LOCAL_VARIABLE,     ANNOTATION_TYPE,        PACKAGE
}

          其中的取值区别:
         


         2.3 注解接口内部的成员

               注解内部的成员都是参数,参数出现的形式类似于  方法的书写格式.
               之所以称为参数那是因为使用注解的时候  都是   @注解名(XX)   XX就是注解的参数
                有一个value的特殊参数,可以有也可以没有这个参数的.
                 如果有value这个特殊参数的  @注解名(XX)  是成立的
                但是如果没有value 这个特殊的参数, @注解名(参数名=XX) 
                
              

            例如:  Retention

            其中含有value的参数,使用的时候直接进行  Retention(RetentionPolicy.XXX)即可
            也可以写成              Retention(value = RetentionPolicy.XXX)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {RetentionPolicy value();
}

           例如我们定义一个含有校验信息的注解 FieldInfo
           
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FieldInfo {/*** 字段名称*/String name() default "";/*** 标记一个字段是否是必填项目*/boolean required() default false;/*** 依赖于其他项目字段条件必填*/boolean dependsRequired() default false;/*** dependsRequired为true的时候,标记一个字段条件必填的依赖字段*/String[] dependsField() default {};/*** dependsRequired为true的时候,条件必填时候的策略*/CheckStrategyEnum checkStrategy() default CheckStrategyEnum.NULL;/*** 是否进行长度校验*/boolean lengthCheck() default false;/*** 默认字段值长度*/int length() default 0;
}

          使用该注解的时候:
     
      

 @FieldInfo(name = "打款账户名中文名", required = false, dependsRequired = true, dependsField = {"currency"}, checkStrategy = CheckStrategyEnum.PRODUCT_CURRENCY_RMB)private String bankAccountName = null;

      2.4 注解和类的继承或接口的实现

               2.4.1 接口的实现

                     如果注解修饰了接口中的方法,那么实现类中的方法是获取不到该注解信息的

              2.4.2 父类和子类

                     同上面一样。

                     但是呢修饰在类上面的注解如果子类想获取到信息的话可以使用  @Inherited 修饰该注解

                    


        2.5 注解信息的获取

              首先呢要判定一个  被修饰的对象是否被该注解修饰
              使用  isAnnotationPresent(注解的类)
             这个方法再  Class ,Method , Field 上面都有的
              
             然后使用  getAnnotation(注解的类)  可以获取到该注解的对象
             ,然后通过该对象就可以获取到该注解里面的信息了
 
           例如上面的FieldInfo 注解
           

            

FieldInfo fdInfoAnno = null;
Field f = claz.getXXXXX ;
if (f.isAnnotationPresent(FieldInfo.class)) {fdInfoAnno = f.getAnnotation(FieldInfo.class);chName = fdInfoAnno.name();boolean required = fdInfoAnno.required();...
}


         class和method上面注解的获取是一样的。


如果注解是修饰在接口中的方法,实现类的如何获取呢?

Class<?>[] interfaces = bean.getClass().getInterfaces();

获取到接口的类,然后将这些类再按照上面的获取方法  可以得到


注解之注解的基本概念相关推荐

  1. 深入理解Java:注解(Annotation)基本概念、自定义注解、注解解析器

    深入理解Java:注解(Annotation)基本概念 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadat ...

  2. 注解(注解的概念、注解的分类、自定义注解、注解的原理)

    一.注解的概念 注释: 给人看的,便于阅读代码, 对代码的描述 注解(Annotation): 对代码的描述, 作为代码形式保留下来, Annontation像一种修饰符一样,应用于包.类型.构造方法 ...

  3. 【Java注解】注解基础

    笔记来源:IMOOC Java注解 注解的分类 按照运行机制分 源码注解:注解只在源码中存在,编译成 .class 文件就不存在了 编译时注解:注解在源码和 .class 文件中都存在 运行时注解:在 ...

  4. java 注解 id_java注解

    java注解: Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java 注解是从 Java5 开始添加到 Java ...

  5. java threadsafe 注解_Java 注解详解

    什么是注解 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解.而新手很难理解的主要原因是一些技术文档里的专业术语和名词不太 ...

  6. 【Spring 基础注解】对象创建相关注解、注入相关注解、注解扫描详解

    Spring 基础注解(2.x) 注解基础概念 注解的作用 Spring 注解的发展历程 对象创建相关注解 @Component @Repository.@Service.@Contoller @Sc ...

  7. java编译时注解_Java注解处理器--编译时处理的注解

    1. 一些基本概念 在开始之前,我们需要声明一件重要的事情是:我们不是在讨论在运行时通过反射机制运行处理的注解,而是在讨论在编译时处理的注解. 注解处理器是 javac 自带的一个工具,用来在编译时期 ...

  8. Spring常用注解,注解 IOC ,AOP,MVC 的理解

    文章目录 大佬总结 0.Spring常用注解 0.1.SpringBootController里面的用法 0.1.1.SpringBoot 中常用注解@Controller/@RestControll ...

  9. java 解析注解_Java知识点总结(注解-解析注解)

    Java知识点总结(注解-解析注解) @(Java知识点总结)[Java, 注解] 通过反射获取类.函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑. 使用注解步骤: 定义注解 类中使用注 ...

  10. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )

    文章目录 前言 一.获取 Activity 中的所有方法 二.获取方法上的注解 三.获取注解上的注解 四.通过注解属性获取相关事件信息 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...

最新文章

  1. 二叉树:二叉搜索树实现 逆序数问题
  2. GaitSet:通过交叉视角步态识别
  3. java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !
  4. socket的三次握手
  5. Android Websites
  6. 对于 CDN 的多元理解
  7. MFC中的模态对话框与非模态对话框
  8. 共享几套silverlight2 toolkit最新的皮肤控件样式下载
  9. WINFORM如何只弹出一个子窗体
  10. Linux下查看CPU信息、机器型号等硬件信息
  11. 最大似然估计和最大后验估计
  12. 12个C语言必背实例
  13. HTML5+CSS编写个人博客界面
  14. Ubuntu安装指定版本的内核
  15. 搜狗拼音个性皮肤制作方法
  16. 【译】通过多线程技术提高Android应用性能
  17. CuraEngine引擎命令行调用方法
  18. Python自我成长笔记(二)
  19. 3-4-搭建自己的vue-ssr
  20. C语言——函数的声明

热门文章

  1. 在 Google 工作十年后的感悟
  2. AB测试是什么,怎么做AB测试
  3. “此电话号码无法用于进行验证” 注册gmail邮箱手机号码不能验证的解决方法(已解决)
  4. 纯色图制作APP代码
  5. 计算机网络信息安全参考文献,计算机网络信息安全学论文参考文献 计算机网络信息安全专著类参考文献有哪些...
  6. 高等数学:第八章 多元函数的微分法及其应用(6)微分法在几何上的应用
  7. 远程服务器638,638是什么意思
  8. 求偏导c语言,求偏导是什么?有什么用法?请举例说明。
  9. oracle回收站还原,Oracle从“回收站”恢复删除的表
  10. 冰点还原安装了找不到图标,或许该这样!