java学习笔记11--Annotation

Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息。

java.lang.annotation Annotation接口是所有的Annotation都必须实现的接口。

系统内建的Annotation

在JDK1.5之后,系统中已经建立了如下的三个内建的Annotation类型,用户直接使用即可。

@Override:覆写的Annotation

@Deprecated:不赞成使用的Annotation

@SuppressWarnings:压制安全警告的Annotation

自定义Annotation

Annotation定义格式:

【public】 @interface  Annotation名称{

             数据类型   变量名称();

}

[java] view plaincopy
  1. public @interface Meaning {
  2. String value();
  3. }

之后就直接可以在程序中使用@Meaning的格式

[java] view plaincopy
  1. @Meaning(value="itmyhome")
  2. class Demo{
  3. }

可以在Annotation中设置一个参数,用来接收变量的内容,如上面的value,使用Annotation的时候也必须给参数赋值如:value="itmyhome"

既然可以设置一个参数,则同时也就可以设置多个参数。

[java] view plaincopy
  1. public @interface Meaning {
  2. String key();
  3. String value();
  4. }

此Annotation在使用的时候 需要设置两个参数,一个key一个value

[java] view plaincopy
  1. @Meaning(key="hi",value="itmyhome")
  2. class Demo{
  3. }

也可以设置一个数组进去

[java] view plaincopy
  1. public @interface Meaning {
  2. String[] value();
  3. }

接收的内容要传递数组

[java] view plaincopy
  1. @Meaning(value={"hello","world"})
  2. class Demo{
  3. }

以上所定义的全部的Annotation中有一个特点,所有的参数内容需要在使用注释的时候设置上去,那么也可以为一个参数设置默认的内容,在声明的时候使用default即可。

[java] view plaincopy
  1. public @interface Meaning {
  2. String value() default "";  //默认为空
  3. }

在使用的时候就可以不设置值

[java] view plaincopy
  1. @Meaning
  2. class Demo{
  3. }

在操作中,对于一个Annotation而言有时候会固定期取值范围,只能取固定的几个值,这个时候实际上就需要依靠枚举。

[java] view plaincopy
  1. public enum FormItemType {  //定义枚举类型
  2. hidden,text,select,date
  3. }

定义Annotation

[java] view plaincopy
  1. public @interface Meaning {
  2. FormItemType value() ;  //设置为枚举类型
  3. }

Annotation的取值只能是枚举类型中的值

[java] view plaincopy
  1. @Meaning(value=FormItemType.date)
  2. class Demo{
  3. }

Retention和RetentionPolicy

在Annotation中,可以使用Retention定义个Annotation的保存范围,此Annotation的定义如下:

[java] view plaincopy
  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.FIELD)
  3. public @interface Meaning {
  4. FormItemType value() ;  //设置为枚举类型
  5. }

在以上的Retetion定义中存在了一个RetentionPolicy的变量,此变量用于指定Annotation的保存范围,RetentionPolicy包含三种范围

在三个范围中,最重要的就是RUNTIME范围,因为在执行的时候起作用。

内建Annotation的RetentionPolicy

三个内建的Annotation的定义:

Override定义采用的是@Retention(RetentionPolicy.SOURCE) 只能在源文件中出现

Deprecated定义采用的是@Retention(RetentionPolicy.RUNTIME),可以在执行时出现

SuppressWarnings定义采用的是@Retention(RetentionPolicy.SOURCE),只能在源文件中出现

一个Annotation如果要是想让其变得有意义,则必须结合反射机制取得Annotaion中设置的全部内容。

在Class类中存在以下几种与Annotation操作有关的方法

[java] view plaincopy
  1. package com.itmyhome;
  2. import java.lang.annotation.Annotation;
  3. import java.lang.reflect.Method;
  4. class Demo{
  5. @SuppressWarnings("unchecked")
  6. @Deprecated
  7. @Override
  8. public String toString(){
  9. return "hello";
  10. }
  11. }
  12. public class T {
  13. public static void main(String[] args) throws Exception{
  14. Class<?> c = Class.forName("com.itmyhome.Demo");
  15. Method mt = c.getMethod("toString");   //找到toString方法
  16. Annotation an[] = mt.getAnnotations(); //取得全部的Annotation
  17. for(Annotation a:an){
  18. System.out.println(a);
  19. }
  20. }
  21. }

此时已经取得了一个Annota。以上的操作实际上是通过三个系统内建的Annotation完成的,也可以自定义一个Annotation

[java] view plaincopy
  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.METHOD)
  3. public @interface Meaning {
  4. FormItemType value() ;  //设置为枚举类型
  5. }
[java] view plaincopy
  1. package com.itmyhome;
  2. import java.lang.reflect.Method;
  3. class Demo{
  4. @Meaning(value=FormItemType.select)  //自定义Annotation
  5. @SuppressWarnings("unchecked")
  6. @Deprecated
  7. @Override
  8. public String toString(){
  9. return "hello";
  10. }
  11. }
  12. public class T {
  13. public static void main(String[] args) throws Exception{
  14. Class<?> c = Class.forName("com.itmyhome.Demo");
  15. Method mt = c.getMethod("toString");   //找到toString方法
  16. //指定的注释是否存在于此元素上
  17. if(mt.isAnnotationPresent(Meaning.class)){
  18. Meaning m = mt.getAnnotation(Meaning.class);  //得到指定的Annotation
  19. System.out.println(m.value());                //取得Annotation的值
  20. }
  21. }
  22. }

@Target

指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制,如:@Target(ElementType.ANNOTATION_TYPE)

ElementType的保存范围

java学习笔记11--Annotation相关推荐

  1. Java学习笔记11

    Object类是所有类.数组.枚举类的父类,是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括 数组)都实现这个类的方法. Object类实现了以下方法: 我们来看看在源码中regi ...

  2. java学习笔记11 (构造方法 this深探)

    在开发中,经常需要在创建对象的同事明确对象对的属性值,比如一个person对象创建的时候就应该有name和age 等属性,那么如何做到在创建对象的同时给对象的属性值初始化值呢? 这里介绍构造方法 1 ...

  3. Java学习笔记:2022年1月11日

    Java学习笔记:2022年1月11日 ​ 摘要:这篇笔记主要讲解了一些数据在计算机中的存在方式相关的知识点,并由此延伸出了数据在计算机中的操作以及一些数据结构的知识. 文章目录 Java学习笔记:2 ...

  4. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  5. Java学习笔记-Day64 Spring 框架(二)

    Java学习笔记-Day64 Spring 框架(二) 一.控制反转IOC和依赖注入DI 1.控制反转IOC 2.依赖注入DI 3.Spring IOC容器 3.1.简介 3.2.实现容器 3.2.获 ...

  6. 从零写一个具有IOC-AOP-MVC功能的框架---学习笔记---11. MVC功能之http请求处理器的编写---简易框架最后一公里!

    从零写一个具有IOC-AOP-MVC功能的框架-学习笔记 专栏往期文章链接: IOC功能相关章节: 从零写一个具有IOC-AOP-MVC功能的框架-学习笔记-01.项目初始化 从零写一个具有IOC-A ...

  7. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  8. Java学习笔记(十)--控制台输入输出

    输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...

  9. Hadoop学习笔记—11.MapReduce中的排序和分组

    Hadoop学习笔记-11.MapReduce中的排序和分组 一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出 ...

最新文章

  1. python 下载大文件
  2. 浅析Web2.0技术
  3. Java 蜡烛图_ta-lib 里的蜡烛图形态函数源码
  4. c#图片base64去转义字符_C#实现字符串与图片的Base64编码转换操作示例
  5. elasticsearch使用优化备忘
  6. 三层交换机能传递路由吗?_华为ensp三层交换机VLAN配置静态路由互通
  7. python 获取文件大小_第41p,超级重要,Python中的os库
  8. div+css 单行或者多行超出文本,数字,字母长度自动省略
  9. POJ1661 Help Jimmy(dp)
  10. Web前端——CSS层叠样式表
  11. UI登录表单使用模板素材
  12. 安装MySql报错(This application requires .NET Framework x.x.x)
  13. 既然选择了远方,便只顾风雨兼程……
  14. Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
  15. 小程序快速入门:小程序的基本结构
  16. Android 、AndroidQ 、小米、 oppo等【后台启动界面】问题 解决方案
  17. 安卓平板硬件测试软件,《安兔兔硬件检测》:必备的系统工具
  18. 山东高速资产注入承诺何时兑现 期待画饼成真
  19. 某公司对新员工的公开信
  20. 语音识别论文:Comparing the Benefit of Synthetic Training Data for Various Automatic Speech Recognition Arc

热门文章

  1. 淘宝海量数据库之二:一致性选择
  2. EditText和TextView出现中文、英文等string串的排版问题
  3. Swift快速入门之getter 和 setter
  4. 在 Azure 中管理 Windows 虚拟机的可用性
  5. 微软打造了全球最大的Git代码库
  6. SQL Server ltrim(rtrim()) 去不掉空格
  7. Win8:Snap 实现
  8. opencv 无法找到tbb_debug.dll
  9. 第四篇 Gallery控件
  10. 艾伟_转载:学习 ASP.NET MVC (第五回)理论篇