转载:https://segmentfault.com/a/1190000007623013

简介

注解,java中提供了一种原程序中的元素关联任何信息、任何元素的途径的途径和方法。

注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。注解不会改变程序的编译方式。java编译器会对包含注解与不包含注解的代码生成相同的虚拟机指令。在java中,注解是被当做修饰符(如public/static之类)来使用的。

注解与注释

注释是供人看的,注解是供程序调用的。一种是程序员写给另一个程序员的,一种是程序员写给计算机解析的。

常用注解

  • @Override : 修饰重载父类方法;

  • @Deprecated : 修饰未来将被抛弃的类/方法/属性等等;

  • @SuppressWarnings: 关闭不当编译器警告信息。

注解运行机制分类

  • 源码注解: 注解只在源码中存在,编译成.class文件中不存在;

  • 编译时注解: 注解存在于源码与.class中,运行时不存在;

  • 运行时注解: 在所有阶段都存在,可以影响程序运行逻辑。

注解来源分类

  • 来自jdk的注解:如@Override /@Deprecated等等;

  • 三方的注解: 如junit中的@Test/@Before等等;

  • 自定义注解: 通过元注解自定义的注解。

元注解

给注解进行注解,用于自定义注解。

  • @Target: 指明定义的注解的作用域,其值包括:

    • ElementType.CONSTRUCTOR: 构造方法声明;

    • ElementType.FIELD: 属性/字段声明;

    • ElementType.LOCAL_VARIABLE: 局部变量声明;

    • ElementType.METHOD: 方法声明;

    • ElementType.PACKAGE: 包声明;

    • ElementType.PARAMETER: 参数声明;

    • ElementType.TYPE: 类接口声明;

    • ElementType.ANNOTATION_TYPE: 注解类型声明;

    • ElementType.TYPE_PARAMETER: 类型参数声明(@since 1.8);

    • ElementType.TYPE_USE: 类型使用(@since 1.8)

  • @Retention: 自定义注解的生命周期,其值包括:

    • RetentionPolicy.SOURCE: 只在源码显示,编译时丢弃;

    • RetentionPolicy.CLASS: 编译时记录到.class中,运行时忽略;

    • RetentionPolicy.RUNTIME: 运行时存在,可通过反射来读取。

  • @Inherited: 一个标记注解,阐述了某个被标注的类型是被继承的,只能继承与类。

  • @Documented: 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

自定义注解

//@Target(ElementType.METHOD)
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
String desc() default "";
String author() default "";
int age() default 18;
}
  • 使用关键字@interface定义注解;

  • 成员变量以无参无异常的方式声明;

  • 可以通过default关键字给成员变量指定默认值;

  • 成员变量的类型是受限制的,包括原始类型、String、Class、Annotation、Enumeration;

  • 如果注解只有一个成员变量,则成员名称必须取名value(),在使用中可以忽略成员名称与赋值号(=);

  • 注解可以没有成员,没有成员的注解称为标示注解。

使用注解

// @<注解名称>(<成员名1>=<成员值1>,<成员名2>=<成员值2> ...)

@Description(desc = "I'm class annotation")
public class AnnotationApp { @Description(desc = "I'm method annotation",author = "rudy")
public String eyeColor(){
return "red";
}
}

解析注解

通过反射获取类、方法、成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

import Annotation.Description;
import org.junit.Test; public class AnnotationTest { @Test
public void testParse() throws ClassNotFoundException {
// 取出注解
Class cls = Class.forName("Annotation.AnnotationApp");
boolean isExit = cls.isAnnotationPresent(Description.class);
if(isExit){
// 做逻辑处理
Description annotation = (Description) cls.getAnnotation(Description.class);
System.out.println("get annotation:" + annotation.desc());
}else{
System.out.println("no annotation!");
}
}
}
  • 使用类加载器加载类,获取类对象;

  • 判断是否存在类注解;

  • 取出类注解,做逻辑处理;

  • 方法注解类似。

java中的注解(Annotation)的更多相关文章

  1. 简单介绍 Java 中的注解 (Annotation)

    1. 例子 首先来看一个例子: @Override public String toString() { return "xxxxx"; } 这里用了 @Override, 目的是 ...

  2. java中的注解详解和自定义注解

    一.java中的注解详解 1.什么是注解 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数据.比如,下面这段代码: @Override public Str ...

  3. java中元注解

    java中元注解有四个: @Retention @Target @Document @Inherited:  @Retention:注解的保留位置 @Retention(RetentionPolicy ...

  4. 【java】细说 JAVA中 标注 注解(annotation)

    Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用 下面我们来详细说说这个注解,到底是怎么一 ...

  5. 【java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  6. 【转载:java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  7. Java学习之注解Annotation实现原理

    前言: 最近学习了EventBus.BufferKinfe.GreenDao.Retrofit 等优秀开源框架,它们新版本无一另外的都使用到了注解的方式,我们使用在使用的时候也尝到不少好处,基于这种想 ...

  8. java中的注解总结

    1. 什么是注解 注解是java5引入的特性,在代码中插入一种注释化的信息,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解.注解也叫元数据(meta data).这些注解信 ...

  9. Java中的注解基础

    一.元注解 元注解的作用就是负责注解其他注解. 1.@Target @Target用来指明注解所修饰的目标,包括packages.types(类.接口.枚举.Annotation类型).类型成员(方法 ...

随机推荐

  1. Multiple dex files define Lcom/google/zxing/BarcodeFormat

    解决zxing “Could not find class 'com.goole.zxing.Result”和“Multiple dex files define”问题 时间 2014-04-24 1 ...

  2. Cannot add Controls from 64-bit Assemblies to the Toolbox or Use in Designers Within the Visual Studio IDE

    原文地址:https://support.microsoft.com/en-us/kb/963017 Source: Microsoft Support RAPID PUBLISHING RAPID ...

  3. TFS二次开发系列:一、TFS体系结构和概念

    TFS是Team Fundation Server的简称,是微软VSTS的一部分,它是Microsoft应用程序生命周期管理(ALM)工具的核心协作平台,简单的说它是管理和开发软件项目的整个生命周期的 ...

  4. 优雅的数组降维——Javascript中apply方法的妙用

    将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转换.本文将从朴素的循环转换开始,逐一介绍三 ...

  5. 【转】C#中WinForm程序退出方法技巧总结

    C#中WinForm程序退出方法技巧总结 一.关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.Ex ...

  6. T-SQL 基础学习 03

    局部变量 在T-SQL中,局部变量的名称必须以标记@作为前缀 语法 DECLARE @变量名数据类型 局部变量的赋值 方法一 SET @变量名 = 值 方法二 SELECT @变量名 = 值 SET和 ...

  7. jQuery Live Query 插件

    http://www.cnblogs.com/sunjing/archive/2008/12/06/1349097.html 上篇日志里写到的那个问题其实有种更简单的解决办法,就是使用jquery的L ...

  8. 封锁Skype的广告(非原创)

    这个我也忘记在哪看的了 记录一下 好早以前微软收购了Skype 然后Skype就出现广告了.... 好吧废话少说  打开 控制面板 -> 网络和Internet -> Internet选项 ...

  9. ACM: FZU 2107 Hua Rong Dao - DFS - 暴力

    FZU 2107 Hua Rong Dao Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  10. jQuery学习笔记--JqGrid相关操作 方法列表(上)

    1.获得当前列表行数:$("#gridid").getGridParam("reccount"); 2.获取选中行数据(json):$("#gridi ...