注解(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());
    }
}

Java注解基本介绍的更多相关文章

  1. 功能:Java注解的介绍和反射使用

    功能:Java注解的介绍和反射使用 一.注解 1.注解介绍 java注解(Annotation),又称为java标注,是jdk5.0引入的一种机制. Java 语言中的类.方法.变量.参数和包等都可以 ...

  2. java基础---->java注解的使用(一)

    注解是众多引入到Java SE5中的重要的语言变化之一.它为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据.今天我们就开始学习一下java中注解的知识. j ...

  3. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  4. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  5. Java注解(一):介绍,作用,思想及优点

    “注解优先于命令模式”-出自<Effective Java> Java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供 ...

  6. 19.Java 注解

    19.Java注解 1.Java内置注解----注解代码 @Deprecated                                    //不推荐使用的过时方法 @Deprecated ...

  7. 第四节 数据格式化和ModelAttribute注解的介绍

    从来都不坦荡,情绪都写在脸上:不开心的时候,不爱说话,笑也勉强. 课堂笔记,如果这么写,不仅仅是手速,还要有语速, 这样不太适合! --胖先生 关于数据传递: 客户端传递数据到服务端: 1.使用普通的 ...

  8. @interface java注解

    @Documented,@Retention,@Target,@Inherited 1. 编写自定义@Todo注解经常我们在写程序时,有时候有些功能在当前的版本中并不提供,或由于某些其它原因,有些方法 ...

  9. Java注解实践

    Java注解实践 标签 : Java基础 注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK ...

随机推荐

  1. 华为上机测试题(求亮灯数量-java)

    PS:自己写的,自测试OK,供大家参考. /* 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1.2.3.…n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着.有n个学 ...

  2. [转]Google gflags使用说明

    gflags是什么: gflags是google的一个开源的处理命令行参数的库,使用c++开发,具备python接口,可以替代getopt. gflags使用起来比getopt方便,但是不支持参数的简 ...

  3. 16aspx源码要求安装.csproj类型怎么安装

    更改打开方式(不要双击打开),右键项目-打开方式选VS打开(应该会出现一个转换界面,转换下就好了).如果没有出那个界面我也没办法了

  4. Python的网络编程[1] -> FTP 协议[2] -> 使用 ftplib 建立 FTP 客户端

    使用 ftplib 建立 FTP 客户端 用于建立FTP Client,与 pyftplib 建立的 Server 进行通信. 快速导航 1. 模块信息 2. 建立 FTP 客户端 1. 模块信息 1 ...

  5. HashSet底层存储元素的源码分析

    此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持.它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用 null 元素. HashSet<Strin ...

  6. js部分的总结

    一.词法结构 1.区分大小写 2.注意//单行/*多行注释* 3.字面量(直接量 literal) 12 //数字 5.8 //小数 “hello” ‘hello’ true /js/gi  //正则 ...

  7. Delphi TClientDataset查找定位功能

    if CDSUserFunc.Locate('mod_id;res_id', VarArrayOf([UserFunc.MOD_ID, UserFunc.RES_ID]), [loCaseInsens ...

  8. 手动删除SVCH0ST.EXE的方法

        最近几天在办公室的计算机上又发现了一种病毒,在进程管理器中多出了两个进程:SVCH0ST.EXE.IEXPLORE.EXE,经一番查看揭开了它们的真面目,现将清除这种病毒的方法总结如下: 病毒 ...

  9. docker下载ubuntu并进行修改后生成新的镜像提交

    一  docker pull ubuntu ,先下载下来一个镜像, 或者 从本地启动一个镜像 docker run -i -t ubuntu /bin/bash 二 进入一定更新操作 # shell ...

  10. c++类型所占的字节和表示范围

    一:数值类型的大杂烩 (1)short.int 和 long 类型都表示整型值.存储空间的大小不同 一般, short 类型为半个机器字长,int 类型为一个机器字长,而 long 类型为一个或两个机 ...