什么是注解

注解(Annotation),也叫(metadata)元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。这些信息被存储在Annotation的“name=value”结构对中。

那么你可能又有疑问什么是(metadata)元数据呢?

这个解释起来比较抽象,我的理解是:“数据的数据”。

那它有什么作用呢,如果要对于元数据的作用进行分类,还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:

  • 编写文档:通过代码里标识的元数据生成文档。

  • 代码分析:通过代码里标识的元数据对代码进行分析。

  • 编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查

注解的分类

根据注解的参数个数分类:

  • 标记注解。一个没有成员的 Annotation,这种类型仅仅使用自身的存在与否来为我们提供信息。标记注解非常常见,比如上面所说的 @Override
    @override,就是标记注解

  • 单值注解。成员的参数为单个参数

  • 完整注解。成员的参数为多个参数

根据注解使用的方法和用途分类:

  • JDK内置系统注解

  • 元注解

  • 自定义注解

它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。下面我具体根据注解使用的方法和用途分类来讲解。

内置注解

内置注解分为三类:

  • @Override

  • @Deprecated

  • @SuppressWarnings

1、@Override

它的作用是对覆盖超类中方法的方法进行标记,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出错误警告。换句话理解就是重写父类方法,方法前的标记。

    @Override
protected void onStart() {
super.onStart();
}
2、@Deprecated

它的作用是对不应该再使用的方法添加注解,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能。

public class User {

    @Deprecated
public static String getName(){
return "user";
} }

调用 getName 方法:

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//@Deprecated 方法已经过时 出现中划线
User.getName(); } }
3、@SuppressWarnings

其参数有:

  • deprecation 使用了过时的类或方法时的警告
  • unchecked 执行了未检查的转换时的警告
  • fallthrough 当 switch 程序块直接通往下一种情况而没有 break 时的警告
  • path 在类路径、源文件路径等中有不存在的路径时的警告
  • serial 当在可序列化的类上缺少serialVersionUID 定义时的警告
  • finally 任何 finally 子句不能正常完成时的警告
  • all 关于以上所有情况的警告
public class User {

    @SuppressWarnings("deprecation")
public static int getAge() {
return 18;
} }

元注解

元注解就是定义注解的注解,由 java API 提供,分别有四个元注解:

  • @Target

  • @Retention

  • @Documented

  • @Inherited

1、@Target

用于描述注解的使用范围。修饰的对象范围:packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如 catch 参数)。

它的值在枚举类 ElemenetType 中:

  • CONSTRUCTOR: 用于描述构造器
  • FIELD : 用于描述域
  • LOCAL_VARIABLE: 用于描述局部变量
  • METHOD : 用于描述方法
  • PACKAGE : 用于描述包
  • PARAMETER : 用于描述参数
  • TYPE : 用于描述类、接口(包括注解类型) 或enum声明

Mode类可以注解类的成员变量:

@Target(ElementType.FIELD)
@Documented
public @interface Mode {
public int value() default 0;
}

Person可以注解类、接口(包括注解类型)、或者enum声明:

@Target(ElementType.TYPE)
public @interface People {
public String value() default "";
}
2、@Retention

表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效),定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取。

RetentionPoicy取值:

  • SOURCE : 在源文件中有效(即源文件保留)
  • CLASS : 在class文件中有效(即class保留)
  • RUNTIME : 在运行时有效(即运行时保留)

Page 注解的RetentionPolicy 的值为 RUNTIME,这样注解处理器可以通过反射,获取到该注解的属性,从而做一些运行时的逻辑处理。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Page {
public int value() default 1;
}
3、@Documented

用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,Documented 是一个标记注解,没有成员。将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。

@Documented
public @interface Page {
public int value() default 0;
}
4、@Inherited

允许子类继承父类中的注解,是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation

当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

java:注解(一)的更多相关文章

  1. Java注解

    Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...

  2. 19.Java 注解

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

  3. Java注解入门

    注解的分类   按运行机制分:   源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...

  4. java注解(Annotation)解析

    注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...

  5. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  6. attilax.java 注解的本质and 使用最佳实践(3)O7

    attilax.java 注解的本质and 使用最佳实践(3)O7 1. 定义pojo 1 2. 建立注解By eclipse tps 1 3. 注解参数的可支持数据类型: 2 4. 注解处理器 2 ...

  7. paip.java 注解的详细使用代码

    paip.java 注解的详细使用代码 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/att ...

  8. JAVA 注解的几大作用及使用方法详解【转】

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  9. 框架基础——全面解析Java注解

    为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ...

  10. Java注解配置

    Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annota ...

随机推荐

  1. 【bzoj1316】树上的询问 树的点分治+STL-set

    题目描述 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 输入 第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行 ...

  2. HexEdit Linux下命令集

    HexEdit Linux下命令集 HexEdit是一款十六进制的编辑器. 移动(Moving) , 移动到文件首部/尾部(go to start/end of the file) → 下一个字符(n ...

  3. AGC 26 D Histogram Coloring

    题目 将柱子的高度离散化$\DeclareMathOperator{\dp}{dp}$ 设第 $i$ 根柱子实际高度是 $h_i$,离散化之后的高度是 $g_i$:第 $i$ 高的高度是 $H_i$, ...

  4. javasript 按值传递

    现象总结如下: 1.JS的基本类型,是按值传递的.2.对于对象而言:分两种情况(a).如果传递给函数的参数是对象,并且修改了这个对象的属性(某些字段的值),那么奇妙的问题就来了.原参数就被修改了.(b ...

  5. Codeforces Round #315 (Div. 2) B 水题强行set

    B. Inventory time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  6. webstorm卡顿

    http://blog.csdn.net/qq673318522/article/details/50583831 http://www.xiaobai8.com/Blog/1000.html

  7. 游戏(bzoj 1854)

    Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性 ...

  8. PAT 天梯赛 L1-043 阅览室

    L1-043. 阅览室 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者 ...

  9. git常见操作总结

    git config --global user.name "liyang"git config --global user.email "liyangslj@126.c ...

  10. 冬训day3 简单数据结构

    A - 简单计算器 模拟加栈..写一写就好,从头到尾扫一遍,分两个栈存,一个存运算符,一个存中间结果,遇到乘除就先处理了,每次遇到加减就处理上一个加减的两个数,结果压进去...同时把这个运算符存进去. ...