注释:

jdk5.0后,Java增加了对元数据的支持。也就是Annotation(注释)。

他是是代码中的特殊标记,可以在代码编译,类加载,运行时被读取,并执行相应的处理。这样用Annotation开发在不改变原有逻辑情况下,在源文件中补充嵌入一些信息。开发工具可以通过这些信息进行验证,或部署。

Annotation提供了条为程序元素设置元数据的方法。从某些方面来看,Annotation就像修饰符一样被使用。可用于修饰包,类,成员变量,方法,参数,构造器,局部变量的声明。这些信息储存在Annotation的“name=value”对中。

注意:Annotation是一个接口。程序可以通过反射来获得指定程序元素的Annotation对象,然后通过Annotation对象获得注释里的元数据。

接下来提到的Annotation,有的是Java.lang,Annotation,有的是注释本身。

Annotation不能影响程序的执行,增加或减少Annotation,程序都一如既往得执行。如果希望程序里的Annotation发挥作用,只有通过配套的工具(Annotation Processing Tool)对Annotation里的信息访问和处理。

Annotation必须通过工具处理,工具负责处理Annotation里面包含的元数据。工具会根据里面的元数据增加额外的功能。先了解下三个Annotation的基本用法。

使用Annotation,在其前面加@,并把该Annotation当做修饰符来用,用来支持他修饰的程序元素。

@Override

@deprecated

@SuppressWarnnings

@Override修饰一个方法,指定方法覆载(告诉编译器要检查这个方法,并从父类查找是否包含了被该方法重写的方法,否则就编译错误)。强制一个子类必须覆盖覆类方法。

@deprecated

标记程序元素已过时。当其他程序使用它时,就会发出警告。

@SuppressWarnnings

刚刚介绍的是java.lang.Annotation三个基本的注释,

下面介绍自定义的Annotation,完成实际的一些功能。

定义新的Annotation用@interface

举例:定义了一个简单的Annotation

 public @interface Test{

     }

使用它修饰类

 @Test
public class Apple<T extends Number> {
}

修改方法

import org.junit.Test;
public class Apple<T extends Number> {
@Test
public void name() { }
}

可修饰任何程序元素,类,接口,方法等

同时带成员变量的Annotation

public @interface Test{
//注释里的成员变量以方法形式定义
String name();
int age();
}

 定义了成员变量后,使用它的时候为其指定值

public class TestCircle {
@Test(age = 5, name = "小猪")
public void name() { }
}

 也可以在定义它时为它指定初始值(如果有初始化的默认值,就可以在使用时不 指定值,有了指定值,初始值就不起作用)


public @interface Test{
//注释里的成员变量以方法形式定义
String name() default "小猪";
int age() default 7;
}

根据Annotation里是否包含成员变量可以把其分成两类:

标记Annotation:不包含成员变量,如@Override

元数据Annotation:包含成员变量,因为他可以接受更多的元数据,所以叫元数据Annotation

提取Annotation信息

前面提到了java用Annotation接口来代表程序前面的注释。AnnotatedElement这个接口是所有的Annotation类型的父接口。该接口有以下几个实现类

Class类定义

Constructor构造器定义

Package包定义

Field类的成员变量定义

Method类的方法定义

以上扩充了读取运行时Annotation的能力。当一个Annotation被定义为运行Annotation后,该注释运行时才可见,当class文件被装载时,被保存class文件里的Annotation才会被虚拟机读取。在java反射包AnnotatedElement代表了程序中可接受注释的程序元素。

程序如果通过反射获得AnnotatedElement接口实现类,可以通过调用该类的如下三个方法获得Annotation信息。

getAnnotation(Class<T> annotationClass) 获得该元素存在的指定类型的注释。

getAnnotations() 获得该元素存在的所有注释。

boolean isAnnotationPresent(Class<? extend AnnotationannotationClass)判断该程序元素是否包含了指定元素的注释。存在返回True,不存在返回false

 

下面是使用 Annotation举例

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) //@Retention注释该注释在jvm运行时保留
@Target(ElementType.METHOD) //定义注解应用类
public @interface Test{
String name() default "小猪";
int age() default 5;
}

 

public class TestCircle {
@Test(age = 5, name = "小猪")
public void name() { }
}

上面提到的这些注释仅仅标识程序元素,不会对程序有任何影响。为了让注释起作用,必须为注释提供一个注释处理工具。

待续....

Annotation注释详解~的更多相关文章

  1. JScript中的条件注释详解(转载自网络)

    JScript中的条件注释详解-转载 这篇文章主要介绍了JScript中的条件注释详解,本文讲解了@cc_on.@if.@set.@_win32.@_win16.@_mac等条件注释语句及可用于条件编 ...

  2. Spring boot注解(annotation)含义详解

    Spring boot注解(annotation)含义详解 @Service用于标注业务层组件@Controller用于标注控制层组件(如struts中的action)@Repository用于标注数 ...

  3. Nginx配置文件中文注释详解

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...

  4. Java_注解_01_注解(Annotation)详解

    一.注解的概念 Annotation(注解)是插入代码中的元数据(元数据从metadata一词译来,就是“描述数据的数据”的意思),在JDK5.0及以后版本引入.它可以在编译期使用预编译工具进行处理, ...

  5. Java Annotation使用详解

    Java  Annotation是JDK5.0引入的一种注释机制.它与注释有一定区别,可以理解为代码上的特殊标记,通过这些标记我们可以在编译,类加载,运行等程序类的生命周期内被读取.执行相应的处理.通 ...

  6. 注解Annotation原理详解及其应用示例

    一.什么是注解 注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进 ...

  7. (转)Java 标注(Annotation)详解

    转:http://blog.csdn.net/nbrremix/article/details/7337274 元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所 ...

  8. 关于opencv中人脸识别主函数的部分注释详解。

    近段时间在搞opencv的视频人脸识别,无奈自带的分类器的准确度,实在是不怎么样,但又能怎样呢?自己又研究不清楚各大类检测算法. 正所谓,功能是由函数完成的,于是自己便看cvHaarDetectObj ...

  9. IE条件注释详解

    IE条件注释是微软从IE5开始就提供的一种非标准逻辑语句,作用是可以灵活的为不同IE版本浏览器导入不同html元素,如:样式表,html标签等.很显然这种方法的最大好处就在于属于微软官方给出的兼容解决 ...

  10. mapreduce入门之wordcount注释详解

    mapreduce版本:0.2.0之前 说明: 该注释为之前学习时找到的一篇,现在只是在入门以后对该注释做了一些修正以及添加. 由于版本问题,该代码并没有在集群环境中运行,只将其做为理解mapredu ...

随机推荐

  1. C++数据的共享和保护

    1.函数原型作用域:C++中最小的作用域 ①在函数原型声明时,形参的作用范围就是函数原型作用域. 2.局部作用域/块作用域 3.类作用域 类可以被看做是一组有名成员的集合,类X的成员m具有类作用域,对 ...

  2. Asp.net mvc基础(十四)Entity Framework

    一.EntityFramework介绍 1.ORM:Object Relation Mapping,用操作对象的方式来操作数据库 2.ORM工具有很多,其中Dapper.PetaPoco.NHiber ...

  3. Java 里的对象在虚拟机里面是怎么存储的?

    Java 中的对象在虚拟机里的存储 在 Java 中,对象在虚拟机中的存储方式取决于 JVM 内存模型,主要存储在 堆(Heap) 中.对象的内存布局和管理方式会影响对象的创建.访问和销毁.下面详细解 ...

  4. (原创)[开源][.Net Framework 4.0] SimpleLiveDataFeed(极易使用的采集数据滚动显示,基于MSChart)更新 v1.0,增加NuGet包

    一.前言 不管还有没有用的,即然是自己原创,就开源了发出来吧,也算是在这互联网上留下了些许记忆. 碎碎念:很早之前的 Windows Mobile 6.5/6.5.3 相关开发记录因为懒惰,现在想回忆 ...

  5. IEC101、IEC103、IEC104、Modbus报文解析工具

    一.概述 国际电工委员会第57技术委员会(IEC TC57)1995年出版IEC 60870-5-101后,得到了广泛的应用.为适应网络传输,2000年IEC TC57又出版了IEC 60870-5- ...

  6. 【神兵利器】Windows平台shellcode免杀加载器

    项目介绍 免杀,bypassav,免杀框架,nim,shellcode,使用nim编写的shellcode加载器,可快速生成免杀可执行文件 下载地址 Windows平台shellcode免杀加载器下载 ...

  7. 【记录】Python3|Selenium4 极速上手入门(Windows)

    环境:Windows 版本:python3,selenium 4.11.2 写这个是方便自己重装电脑时重新装 Selenium,懒得每次都重新找链接. 文章目录 1 装 Chrome Edge 其他浏 ...

  8. django笔记补充

    安装 pip install django环境变量: C:\Program Files\Anaconda3\Scriptsdjango-admin startproject mysite 创建djan ...

  9. 关于The JSON value could not be converted to System.DateTime的解决方案

    如下json格式提交到后台后报: The JSON value could not be converted to System.DateTime. Path: $.beginTime | LineN ...

  10. C++11 auto和decltype关键字

    今天来看下C++中的auto和decltype两个关键字 auto关键字定义变量,编译器会自动判断变量的类型 举个栗子: auto i =100; // i 是 int auto p = new A( ...