当前位置: 首页 > 编程日记 > 正文

java学习笔记11--Annotation

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的保存范围

相关文章:

GoogleLog(GLog)源码分析

GLog是Google开发的一套日志输出框架。由于其具有功能强大、方便使用等特性&#xff0c;它被众多开源项目使用。本文将通过分析其源码&#xff0c;解析Glog实现的过程。 该框架的源码在https://github.com/google/glog上可以获取到。本文将以目前最新的0.3.3版本源码为范例进行…

Ajax Toolkit 控件学习系列(13) ——FilteredTextBoxExtender 控制输入

这个控件的作用是对TextBox所要输入的内容进行过滤控制。按照自己需要过滤&#xff0c;可以自定义&#xff0c;再或者使用定义好的方式。看效果。效果不是很突出&#xff0c;说明下&#xff0c;就是只能输入大写字母和数字。因为加了限制&#xff0c;但是具体有什么高深的应用呢…

Uber最新开源Manifold,助力机器学习开发者的可视化与调试需求

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送作者 | Lezhi Li译者 | 凯隐编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】2019 年 1 月&#xff0c;Uber 推出了 Manifold&#xff0c;一款与模型无…

jQuery对象和DOM对象使用说明

1.jQuery对象和DOM对象第一次学习jQuery,经常分辨不清哪些是jQuery对象&#xff0c;哪些是 DOM对象&#xff0c;因此需要重点了解jQuery对象和DOM对象以及它们之间的关系.DOM对象&#xff0c;即是我们用传统的方法(javascript)获得的对象&#xff0c;jQuery对象即是用jQuery类库…

[WPF疑难]避免窗口最大化时遮盖任务栏

[WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是&#xff1a;如果窗口的WindowStyle被直接或间接地设置为None后&#xff08;比如很多情况下你会覆盖默认的窗体样式&#xff0c;即不采用Windows默认的边框和最大化最等按钮&#xff0c;来打造个…

Google Mock(Gmock)简单使用和源码分析——简单使用

初识Gmock是之前分析GTest源码时&#xff0c;它的源码和GTest源码在同一个代码仓库中&#xff08;https://github.com/google/googletest&#xff09;。本文我将以目前最新的Gmock1.7版本为范例&#xff0c;分析其实现原理。&#xff08;转载请指明出于breaksoftware的csdn博客…

浪潮刘军:为什么说计算力是AI时代“免费的午餐”?

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;产业AI、元脑生态是浪潮集团2019年度的两大关键词。作为一家以计算力为核心生产力的企业&#xff0c;浪潮还一直强调人工智能计算是未来最重要的计算力&#xff0c;而无论产业AI、元脑生态都构筑于计算的基础设施之上。…

Journey源码分析四:url路由

2019独角兽企业重金招聘Python工程师标准>>> 在入口函数main()的default分支中&#xff0c;对路由进行了注册&#xff0c;现在分析下。 ##main()中路由注册相关代码 源码: httpRouter : httptreemux.New() // Blog and pages as http server.InitializeBlog(httpRou…

“天河二号”总工程师杜云飞谈星光超算应用平台设计

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】12 月 21-22 日&#xff0c;OpenI/O 启智开发者大会在深圳召开。在大会上&#xff0c; 国家超级计算广州中心总工程师、“天河二号”总工程师杜云飞发表了题为《星光超算应用平台》的主题报告&…

Google Mock(Gmock)简单使用和源码分析——源码分析

源码分析 通过《Google Mock(Gmock)简单使用和源码分析——简单使用》中的例子&#xff0c;我们发现被mock的相关方法在mock类中已经被重新实现了&#xff0c;否则它们也不会按照我们的期待的行为执行。我们通过阅读源码&#xff0c;来分析整个过程的实现逻辑。&#xff08;转载…

远程控制软件VNC教程和对内网机器控制的实现

网络遥控技术是指由一部计算机&#xff08;主控端&#xff09;去控制另一部计算机&#xff08;被控端&#xff09;&#xff0c;而且当主控端在控制端时&#xff0c;就如同用户亲自坐在被控端前操作一样&#xff0c;可以执行被控端的应用程序&#xff0c;及使用被控端的系统资源…

GRUB2相关概念

GNU GRUB&#xff0c;简称“GRUB”&#xff0c;是一个来自GNU项目的启动引导程序。GRUB是多启动规范的实现&#xff0c;它允许用户可以在计算机内同时拥有多个操作系统&#xff0c;并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核&#xff0c…

朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型

做Linux网络开发&#xff0c;一般绕不开标题中几种网络编程模型。网上已有很多写的不错的分析文章&#xff0c;它们的基本论点是差不多的。但是我觉得他们讲的还不够详细&#xff0c;在一些关键论点上缺乏数据支持。所以我决定好好研究这几个模型。&#xff08;转载请指明出于b…

支付宝账单出来后,除了总消费,你看到你的学习支出了吗?

当支付宝的2019年年度账单出来的时候很多人的第一反应就是我怎么花了这么多钱不少人都有这样的困惑忙忙碌碌一年到头&#xff0c;到底得到了什么&#xff1f;而这一切又和自己最开始的规划一样吗&#xff1f;其实从账单上可以看出你在2019年花费了哪些大头居家生活、穿衣打扮还…

体验Windows 7的Superbar

随着PDC 2008上Windows 7 M3 6801的发布&#xff0c;这个微软的下一代操作系统也渐渐浮出了水面。对于我们这些普通的PC用户而言&#xff0c;Windows 7相对于Windows Vista最显而易见的改变&#xff0c;无疑就是著名的Superbar任务栏了。说起它相比于原来的任务栏变化&#xff…

Linux 安装图形界面及远程连接

#可查询哪些组件是否已经安装(可用来对照组件名称&#xff09; yum grouplistyum groupinstall X Window System -y #安装GNOME桌面环境 yum groupinstall GNOME Desktop Environment -y #安装KDE桌面环境 yum groupinstall KDE (K Desktop Environment)卸载 卸载GNOME桌面环境…

朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型

在《朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型》中我们分析了朴素模型的一个缺陷——一次只能处理一个连接。本文介绍的Select模型则可以解决这个问题。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 和朴素模型一样&#xff0c;我们首先…

微软开源NAS算法Petridish,提高神经网络迁移能力

作者 | Jesus Rodriguez译者 | Rachel编辑 | 夕颜出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 【导读】神经架构搜索&#xff08;Neural architecture search, NAS&#xff09;是深度学习中最热门的趋势之一。NAS方法针对特定问题和数据…

[转]g++ 编译多个相关文件

三个文件&#xff0c;一个头文件&#xff0c;两个程序文件 /*d.h */#include <iostream>usingnamespacestd; classDataset { public: intgetdata(); }; /*d.cpp */#include "d.h"intDataset::getdata() { return1231; } /*out.cpp */#include <ios…

POJ--2391--Ombrophobic Bovines【分割点+Floyd+Dinic优化+二分法答案】最大网络流量

联系&#xff1a;http://poj.org/problem?id2391 题意&#xff1a;有f个草场&#xff0c;每一个草场当前有一定数目的牛在吃草&#xff0c;下雨时它能够让一定数量的牛在这里避雨&#xff0c;f个草场间有m条路连接&#xff0c;每头牛通过一条路从一点到还有一点有一定的时间花…

25年了,我总结出这些信息提取的经验教训

作者 | Ehud Reiter译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】近日&#xff0c;本文作者阿伯丁大学计算科学系教授 Ehud Reiter 及其带领的阅读小组读了一篇让他们印象深刻的论文——由 Ralph Grishman 发表的《信息提取 25 年》&#xff08…

朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型

在《朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型》中&#xff0c;我们分析了它只能支持1024个连接同时处理的原因。但是在有些需要同时处理更多连接的情况下&#xff0c;1024个连接往往是不够的&#xff0c;也就是不能够高并发。那么这个时候我们就可以采用…

flashcom中远程共享对象SharedObject的用法

觉得这篇文章比较好&#xff0c;转载回来。学习fcs也有差不多一个月了,感觉最有特色的东西还是SharedObject.SharedObject有不少东西,本地操作就不说了(相信很多人没接触fcs也用过);就说说远程共享对象吧.基本的应用流程是:my_nc new NetConnection(); my_nc.connect("rt…

Hive-1.2.0学习笔记(一)安装配置

鲁春利的工作笔记&#xff0c;好记性不如烂笔头下载hive&#xff1a;http://hive.apache.org/index.htmlHive是基于Hadoop的一个数据仓库工具&#xff0c;提供了SQL查询功能&#xff0c;能够将SQL语句解析成MapReduce任务对存储在HDFS上的数据进行处理。MySQ安装Hive有三种运行…

邮件安全隐患及其防范技术研究

邮件安全隐患及其防范技术研究<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />陈小兵【antian365.com】摘要电子邮件是Internet上使用最为频繁和广泛的服务&#xff0c;在给人们带来便利的同时&#xff0c;亦带来令人担忧的邮件…

必看!52篇深度强化学习收录论文汇总 | AAAI 2020

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送来源 | 深度强化学习实验室&#xff08;ID:Deep-RL&#xff09;作者 | DeepRLAAAI 2020 共收到的有效论文投稿超过 8800 篇&#xff0c;其中 7737 篇论文进入评审环节&#xff0c;最终收录数量…

朴素、Select、Poll和Epoll网络编程模型实现和分析——Epoll模型

在阅读完《朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型》和《朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型》两篇文章后&#xff0c;我们发现一个问题&#xff0c;不管select函数还是poll函数都不够智能&#xff0c;它们只能告诉我们成功…

Scala 深入浅出实战经典 第88讲:Scala中使用For表达式实现map、flatMap、filter

高级函数 map,flatMap,filter用for循环的实现。package com.dt.scala.forexpressionobject For_Advanced {def main(args: Array[String]) {}def map[A, B](list: List[A], f: A > B): List[B] for(element <- list) yield f(element)def flatMap[A, B](list: List[A], f…

抛弃Python,我们为什么用Go编写机器学习架构?

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送作者 | Caleb Kaiser译者 | 弯月&#xff0c;编辑 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;如今&#xff0c;众所周知Python是机器学习项目中最流行的语言。尽管R、C…

朴素、Select、Poll和Epoll网络编程模型实现和分析——模型比较

经过之前四篇博文的介绍&#xff0c;可以大致清楚各种模型的编程步骤。现在我们来回顾下各种模型&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 模型编程步骤对比《朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型》中介绍的是最基本的网络编程…