Java基础:注解Annotation

从JDK5开始,Java增加了注解(Annotation),注解是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证、处理或者进行部署。

注解提供了一种为程序元素(包、类、构造器、方法、成员变量、参数、局域变量)设置元数据的方法。跟public、static等修饰符一样,注解是这些程序元素的属性,是这些程序元素的一部分,不能脱离程序元素使用。

如果希望注解在运行时起到作用,需要访问和处理注解的工具,这些工具统称为APT(Annotation Processing Tool)。

1  基本注解

JDK默认提供了如下几个基本注解:

  • @Override 

限定重写父类方法。对于子类中被@Override 修饰的方法,如果存在对应的被重写的父类方法,则正确;如果不存在,则报错。@Override 只能作用于方法,不能作用于其他程序元素。

  • @Deprecated

用于表示某个程序元素(类、方法等)已过时。如果使用被@Deprecated修饰的类或方法等,编译器会发出警告。

  • @SuppressWarning

抑制编译器警告。指示被@SuppressWarning修饰的程序元素(以及该程序元素中的所有子元素,例如类以及该类中的方法.....)取消显示指定的编译器警告。例如,常见的@SuppressWarning(value="unchecked")

  • @SafeVarargs

@SafeVarargs是JDK 7 专门为抑制“堆污染”警告提供的。

2 元注解

为了修饰注解定义,JDK提供了如下4个元注解(注解的注解):

  • @Retention
  • @Target
  • @Documented
  • @Inherited

2.1 @Retention

@Retention修饰一个Annotation定义,用于指定被修饰的Annotation可以保留多长时间。

@Retention包含一个value成员变量,该value成员变量是RetentionPolicy枚举类型的。使用@Retention时,必须为其value指定值。

value成员变量的值只能是如下3个:

  • RetentionPolicy.SOURCE:注解只保留在源代码中,编译器编译时,直接丢弃这种注解。
  • RetentionPolicy.CLASS:编译器把注解记录在class文件中。当运行Java程序时,JVM中不再保留该注解。
  • RetentionPolicy.RUNTIME:编译器把注解记录在class文件中。当运行Java程序时,JVM会保留该注解,程序可以通过反射获取该注解的信息。

示例:

package com.demo1;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

//@Retention(value=RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnTest {
	String name() default "sunchp";
}

如果注解里有一个value成员变量,使用该注解时可以直接在注解后的括号里指定value成员变量的值,无须使用name=value形式。

2.2 @Target

@Target修饰一个注解定义,用于指定被修饰的注解能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量,该成员变量的值有如下几个:

  • ElementType.TYPE:能修饰类、接口或枚举类型
  • ElementType.FIELD:能修饰成员变量
  • ElementType.METHOD:能修饰方法
  • ElementType.PARAMETER:能修饰参数
  • ElementType.CONSTRUCTOR:能修饰构造器
  • ElementType.LOCAL_VARIABLE:能修饰局部变量
  • ElementType.ANNOTATION_TYPE:能修饰注解
  • ElementType.PACKAGE:能修饰包

示例1(单个ElementType):

package com.demo1;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
public @interface AnnTest {
	String name() default "sunchp";
}

示例2(多个ElementType):

package com.demo1;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface AnnTest {
	String name() default "sunchp";
}

2.3 @Documented

@Documented用于指定被该元注解修饰的注解类定义,将被javadoc工具提取成文档。如果定义注解类A时,使用了@Documented,则所有使用该注解类A修饰的程序元素的API文档中,将会包含该注解类A的说明。

示例:

@Documented
public @interface Testable {
}
public class Test {
	@Testable
	public void info() {
	}
}

2.4 @Inherited

@Inherited指定被它修饰的注解具有继承性。

示例:

package com.demo2;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Inheritedable {

}
package com.demo2;

@Inheritedable
public class Base {

}
package com.demo2;

//SubClass只是继承了Base类
//并未直接使用@Inheritedable注解修饰
public class SubClass extends Base {
	public static void main(String[] args) {
		System.out.println(SubClass.class.isAnnotationPresent(Inheritedable.class));
	}
}

如果Inheritedable 注解被@Inherited修饰,则运行结果为:true;如果Inheritedable 注解没有被@Inherited修饰,则运行结果为:false。

3 自定义注解

4 注解与反射

5 注解本质

6 注解的意义

时间: 2024-08-01 21:09:04

Java基础:注解Annotation的相关文章

java基础-注解Annotation原理和用法

在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为java平台很重要的一部分了,很多的框架程序中也喜欢使用注解,如Spring.Mybatis等. 那么,什么是注解呢?注解就是元数据,一种描述数据的数据,通俗一点就是为程序的元素(类.方法.成员变量)加上更直观的说明,这些说明信息是与程序的业务逻辑无关的.但是,我们可以通过java的反射机制来获取An

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

Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Annotation的工作原理:2.@Override注解:3.@Deprecated注解:4.@SuppressWarnings注解:5.自定义注解:5.1.添加变量:5.2.添加默认值:5.3.多变量使用枚举:5.4.数组变量:6.设置注解的作用范围:6.1.在自定义注解中的使用例子:7.使用反射读取R

Java:注解Annotation(元数据)

本文内容: 注解Annotation的介绍 基本注解的用法 首发日期:2018-07-28 注解Annotation的介绍 Annotation是代码中的特殊标记,能够在编译.类加载.运行时被识别(需要设置),并根据不同的Annotation来执行不同的处理. Annotation可以修饰包.类.构造器.函数.成员变量.局部变量的声明.参数等程序元素.Annotation帮助这些元素来设置元数据,程序从元数据中获取信息来处理这些元素. 元数据可以描述代码间关系或者代码与其它资源的关系,比如说在w

Java Android 注解(Annotation) 及几个常用开源项目注解原理简析

不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义.解析,并对几个 Android 开源库 Annotation 原理进行简析.PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 完整版原文见:Java Android 注解(Ann

Java自定义注解Annotation的使用

从 jdk5开始,Java增加了对元数据的支持,也就是Annotation,Annotation其实就是对代码的一种特殊标记,这些标记可以在编译,类加载和运行时被读取,并执行相应的处理.当然刚刚说了,Annotation只是一种标记,所以要是在代码里面不用这些标记也是能完成相应的工作的,只是有时候用注解能简化很多代码,看起来非常的简洁. 常见的注解(Annotation) @Override——限定重写父类方法 @Deprecated——标示已过时 @SuppressWarning——抑制编译器

Rhythmk 一步一步学 JAVA (19): 注解 annotation

在编写注解的时候需要了解的四种注解: @Target 表示该注解可以用于什么地方,可能的ElementType参数有: CONSTRUCTOR:构造器的声明 FIELD:域声明(包括enum实例) LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类.接口(包括注解类型)或enum声 @Retention 表示需要在什么级别保存该注解信息.可选的RetentionPolicy参数包括: SOURCE:注解将被编译器

Java基础——注解

一.概述 引自百度百科: 定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释. 二.JDK内置注解 Java提供了三种内建注解. 1. @Override——当我们想要复写父类中的方法时,我们需要使用该注解去告知编译器我们想要复写这个方法.这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息. 2. @Depr

Java自定义注解Annotation详解

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事.标记可以加在包,类,字段,方法,方法的参数以及局部变量上. 自定义注解及其应用 1).定义一个最简单的注解 public @interface MyAnnotation { //...... } 2).把注解加在某个类上: @MyAnnotation public class Annot

java基础 注解 android中的实现

先贴实现的activity的代码: @ContentView(R.layout.activity_main) public class MainActivity extends AppCompatActivity { @ViewInject(R.id.text_view) private TextView textView; @OnClick(R.id.text_view) private void onClick(View view){ textView.setText("我是click后的t

Java 基础之认识 Annotation

Java 基础之认识 Annotation 从 JDK 1.5 版本开始,Java 语言提供了通用的 Annotation 功能,允许开发者定义和使用自己的 Annotation 类型.Annotation 功能包括了关于定义 Annotation 类型的语法,对声明式进行注解的语法,读取 Annotation 的 API,Annotation 在 class 文件中的表现,以及 Annotation 处理工具(APT). Annotation 并不直接对程序的语法产生作用,但是会提供一些程序之