Java 注解使用

news/2025/3/19 23:42:26/

一、注解简介

        注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。这些工具可以在源码层次上进行操作,或者可以处理编译器在其中放置了注解的类文件。

        注解不会改变程序的编译方式。Java编译器对于包含注解和不包含注解的代码会生成相同的虚拟机指令。

        为了能够受益于注解,你需要选择一个处理工具,然后向你的处理工具可以理解的代码中插入注解,之后运用该处理工具处理代码。

Java中,注解是当作一个修饰符来使用的,它被置于被注解项之前,中间没有分号。每一个注解的名称前面都加上了@符号。

二、注解语法

1、注解的定义

注解是由注解接口来定义的:

modifiers @interface AnnotationName {elementDeclaration1elementDeclaration2...
}

每个元素的声明都具有下面这种形式:

type elementName();

 或者

type elementName() default value;

比如我们常用,Spring中用来标记为Bean的注解定义:其中包含一个元素:value

public @interface Component {String value() default "";
}

        所有的注解接口都隐式的扩展自java.lang.annotation.Annotation接口,这个接口是一个常规接口,不是一个注解接口。你无法扩展注解接口,换句话说,所有的注解接口都直接扩展自java.lang.annotation.Annotation。

注解元素的类型为下列之一:

  • 基本类型(int、short、long、byte、char、double、boolean)
  • String
  • Class(具有一个可选的类型参数,例如Class<? extends MyClass>)
  • enum类型
  • 注解类型
  • 上述所述类型组成的数组

下面是个合法的元素声明的例子:

public @interface BugReport {enum Status { UNCONFIRMED, CONFIRMED, FIXED, NOTABUG };boolean showStopper() default false;String assignedTo() default "[none]";Class<?> testCase() default Void.class;Status status() default Status.UNCONFIRMED;Reference ref() default @Reference(); // an annotation typeString[] reportedBy();
}

2、注解的使用

@BugReport(severity=10, assignedTo="Harry")

        其中元素的顺序无关紧要,如果某个元素的值未指定,那么就会使用声明的默认值。

        可以简化写法:如果没有指定元素,要么是因为注解中没有元素,或者使用默认值,这个时候就不用使用圆括号了()。例如:@BugReport。这样的注解又称为标记注解。

        另外一个快捷方式是单值注解。如果元素具有特殊名字value,并且没有指定其他元素,那么就可以忽略掉这个元素名以及等号。例如:@Component("beanName")。

值得注意的是:

  • 因为注解是由编译器计算而来的,因此,所有元素的值必须是编译器常量。
  • 一个注解元素永远不能设置为null,甚至不允许默认值为null,这样在实际应用中会相当不方便,必须使用其他默认值。

如果元素值是一个数组,需要将它的值用括号括起来:

@BugReport(. . . reportedBy={"Harry","Carl"})

如果数组元素是个单值,则可以忽略括号:

@BugReport(. . . reportedBy="Harry")

3、注解的各类声明

        注解可以出现在许多地方,这些地方可以分为两类:声明和类型用法声明注解可以出现在下列声明处:

  • 类(包括enum)
  • 接口(包括注解接口)
  • 方法
  • 构造器
  • 实例域(包含enum常量)
  • 局部变量
  • 参数变量
  • 类型参数

对于类和接口,需将注解放在class和interface关键词前面。

对于变量,需将注解放置在类型的前面

泛化类或方法中的参数可以像下面这样被注解

public class Cache<@Immutable V> {.....}

包是在文件package-info.java中注解的,该文件只包含以注解先导的包语句。

/**
Package-level Javadoc
*/
@GPL(version="3")
package com.horstmann.corejava;
import org.gnu.GPL;

三、标准注解

        Java SE在java. lang、java.lang.annotation和javax.annotation包中定义了大量的注解接口。其中四个是元注解,用于描述注解接口的行为属性,其他的三个是规则接口,可以用它们来注解你的源代码中的项。下表列出了这些注解。

 1、用于编译的注解

@Deprecated注解可以被添加到任何不在被鼓励使用的项上,所以当使用一个过期的项时,编译器将会发出警告,这个注解与javadoc标签@deprecated具有同等功效。

@SuppressWarnings注解会告知编译器阻止特定类型的警告信息。

@Override这种注解只能用到方法上,编译器会检查这种注解的方法是否真正的覆盖了一个来自于超类的方法。

@Generated注解的目的是供代码生成工具来使用。

2、用于管理资源的注解

@PostConstruct@PreDestroy注解用于控制对象生命周期的环境中,标记了这些注解的方法应该在对象被构建之后,或者在对象被移除之前,紧接着调用。

@Resource注解用于资源注入。

3、元注解

3.1、@Target元注解

        @Target元注解可以应用于一个注解,以限制该注解可以应用到哪些项上。下表显示了所有可能的取值情况,它们属于枚举类型ElementType,可以指定任意数量的元素类型,用括号括起来。

         一条没有@Target限制的注解可以应用于任何项上。

3.2、@Retention元注解

        @Retention元注解用于指定一条注解应该保留多长时间,默认值是RetentionPolicy.CLASS。其他类型如下表所示:

 3.3、@Documented元注解

        @Documented元注解为像Javadoc这样的归档工具提供了一些提示,以实现其归档。

注意:将一个注解应用到它自身身上是合法的,例如@Documented注解被自身注解为@Documented。

3.4、@Inherited元注解

        @Inherited元注解只能应用于对类的注解。如果一个类具有继承注解,那么它的所有子类都自动具有同样的注解。


http://www.ppmy.cn/news/885391.html

相关文章

WTM框架页面被其他网站引用免登录

用ASP.NET CORE开发通常都会有这样一个需求&#xff0c;自己框架开发的页面&#xff0c;要被其他网站嵌套引用&#xff0c;但其他网站通过链接到自己的开发页面的时候&#xff0c;通常会有一个登录页面&#xff0c;有的时候网站无缝集成的时候&#xff0c;这就会要求跳过这个WT…

小白的轮播图作业

这是作为小白的第一份作业&#xff0c;纪念一下子~~ 下图为轮播图实现效果&#xff1a; HTML代码块&#xff1a; &#xff08;首先五张图片我给编号1-5,style属性所在定位的层中有效果&#xff0c;定位距左侧为0&#xff1b;五个按钮同样标号1-5&#xff1b;用a标签来调用一函…

宁夏理工计算机管理与应用,宁夏理工学院计算机科学与技术中小学校(计算机教育)...

技校网专门为您推荐的类似问题答案 问题1&#xff1a; 安庆市市区有哪些中小学校 那有几十所&#xff0c;市区主要是迎江和大观区的分管小学&#xff0c;人民路小学&#xff0c;双莲寺小学&#xff0c;高琦小学&#xff0c;依泽小学&#xff0c;健康路小学&#xff0c;四照园小…

企业招聘软件测试笔试题,奇虎软件测试工程师招聘面试笔试题题

《奇虎软件测试工程师招聘面试笔试题题》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《奇虎软件测试工程师招聘面试笔试题题(4页珍藏版)》请在人人文库网上搜索。 1、奇虎软件测试工程师招聘面试笔试题题来源&#xff1a;北航测试空间培训中心发表时间&#xff1a;2…

夏暑七月云南行

七月里远赴云南&#xff0c;入住腾冲曲石原乡。新闻播报中到处都是暑热和水灾&#xff0c;云南腾冲却是一片荫凉&#xff0c;到处绿树婆娑&#xff0c;鲜花烂漫。住进雅居乐山景洋房&#xff0c;不管是泰式别墅“绿野牧歌”&#xff0c;还是景观洋房“山居高黎”&#xff0c;头…

Learn Python The Hard Way (python 2.7) ex45.py 你来制作一个游戏

# -*- coding:utf-8 -*- # 植物大战僵尸 英雄列表 #植物方&#xff1a; # 英雄名 属性 原型 专属超级能量 超级能量效果 #5绿影侠Green Shadow 猛长 聪明 豌豆射手…

机械臂——D-H参数标定

最近重新学习机器人方面的知识&#xff0c;想到一年以前在学校选修《机器人学技术基础》这门课的时候&#xff0c;老师虽然讲机器人的各个方面的知识都讲到了&#xff0c;但只是浮光绿影的的提到&#xff0c;并没有真正讲到深处&#xff0c;我的理解也没有更加深入&#xff0c;…

水乡

http://www.sohu.com/a/311437451_267106 &#xff08;江南水乡&#xff09; 编辑 讨论1 中国人所说的“水乡”&#xff0c;一般是指“江南水乡”。 中国的江南&#xff0c;大体上是指浙江&#xff0c;上海&#xff0c;安徽&#xff0c;江西和江苏长江以南地区&#xff0c;主要…