注解(Annotation),又称元数据(MetaData),提供了一种在代码中添加信息的形式化的方法,将元数据和源代码结合在一起

1. 外部配置文件如XML存在的问题:

  • 代码复杂度较高,需要编写很多重复信息,如包名和全类名,而这些信息在源文件中都已经存在了。
  • 可能需要同时维护源文件和XML,如添加了新的注入对象,可能导致代码同步问题。
  • 要求程序员了解如何编写XML文件。

    使用注解则只需要在代码源文件中进行编写维护简单的注解标识,而其它信息都能从这个源文件获取到

2. Java内置注解

三种标准注解:

  1. @Override:用于方法上,表示当前方法覆盖了父类的方法,若方法签名与父类的不同,则编译器会发出错误提示。
  2. @Deprecated:声明的类、方法等是被废弃的,使用它编译器会发出警告信息。
  3. @SuppressWarnings:忽略警告信息,在使用了如@Deprecated等注解标明的不正常的元素时,可以使用此注解忽略,谨慎使用。

四种元注解:

  1. @Target:注解可以用于什么地方,不声明则用于任何地方,可选的数组参数如下:

    • ElementType.TYPE:类、接口、枚举或注解类型
    • ElementType.FIELD:域声明
    • ElementType.METHOD:方法声明
    • ElementType.PARAMETER:参数声明
    • ElementType.CONSTRUCTOR:构造器声明
  2. @Retention:注解的保存级别,可选的参数如下:
    • RetentionPolicy.SOURCE:源码级别,只在源码中存在,编译后就消失了
    • RetentionPolicy.CLASS:class文件级别,编译后的class文件中仍然存在,但运行时会消失
    • RetentionPolicy.RUNTIME:运行时级别,运行时仍然存在,即会一直存在
  3. @Documented:将此注解包含在 Javadoc 中。
  4. @Inherited:允许子类继承父类中的注解。A使用了此注解,B继承A,则B也认为使用了此注解。

3. 注解基本语法

定义:类似于接口,使用 @interface,定义注解时,一般需要使用一些元注解,如@Target、@Retention。注解不支持继承。

注解元素:注解中一般都会包含一些元素来表示值,注解元素就像是接口的方法,唯一的区别就是可以指定默认值,没有元素的注解称为标记注解,就像一个空的接口一样。

注解元素可以使用的类型包括:

  • 基本数据类型如int、long、double、boolean等
  • String
  • Class类
  • enum枚举
  • Annotation注解本身
  • 以上类型的数组

注解元素要么在定义时指定默认值,要么在使用时指定,不允许有不确定的值,不允许为null。

注解元素在使用时以 key-value 的形式指定,置于注解声明后的括号中,数组使用k={v1,v2}的形式指定。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationCase {
    int id();
    String descr() default "no description";
}

public class AnnotationTest {
    @AnnotationCase(id = 1)
    public String test(){}

    @AnnotationCase(id = 2, descr = "test2")
    public boolean test2() {}
}

4. 为什么使用注解

使用注解能够极大地简化配置文件的开发,我们可以编写自己的注解处理器,利用反射工具处理注解,甚至于完全代替配置文件。

public static void main(String[] args) {
    // 获取 Class 对象
    Class clazz = AnnotationTest.class;
    // 获取 Method 对象
    Method method = clazz.getDeclaredMethods()
    // 获取方法上的 @AnnotationCase 注解标识
    AnnotationCase ac = method.getAnnotation(AnnotationCase.class);
    if(null != ac) {
        System.out.println(ac.id() + " : " + ac.descr());
    }
}

最新文章

  1. Ant打包
  2. [课程设计]Scrum 3.5 多鱼点餐系统开发进度(修复Bug&美化页面)
  3. sqlserver 通用分页存储过程
  4. 让mingw gdb支持STL,并自动load .gdbinit
  5. input 标签左对齐
  6. Linux下批量转换文件编码
  7. Lua中的函数
  8. vue如何使用rules对表单字段进行校验
  9. SetWindowPos 和Z序
  10. python中的轻量级定时任务调度库:schedule
  11. CF1027E Inverse Coloring
  12. Python 多进程应用示例
  13. jQuery 工具大搜集
  14. MongoDB(一)-- 简介、安装、CRUD
  15. shiro学习笔记_0200_认证
  16. [DeeplearningAI笔记]卷积神经网络2.9-2.10迁移学习与数据增强
  17. px,dp,sp以及像素密度
  18. “全栈2019”Java第六章:注释
  19. MySQL LOAD DATA
  20. codeforces 1101F Trucks and Cities 区间dp+单调优化 好题

热门文章

  1. php+ajax+jquery分页并显示数据
  2. python的tips:字符和字符串的问题
  3. input 限制输入字段总结
  4. 让Asp.net Web预启动
  5. 跨集群拷贝hdfs
  6. UVA 1395 Slim Span 最小生成树
  7. Spring Cloud底层原理(转载 石杉的架构笔记)
  8. Lightoj 1348 Aladdin and the Return Journey (树链剖分)(线段树单点修改区间求和)
  9. linux中,在在shadowsoks下怎么更新软件
  10. ScrollView起始位置不是最顶部的解决办法