Java Annotations

Java Annotations提供有关代码的信息。Java注释对它们注释的代码没有直接影响。在java annotations教程中,我们将研究以下内容:

  1. 内置Java注释
  2. 如何编写自定义注释
  3. 注释用法以及如何使用Reflection API解析注释。

目录[ 隐藏 ]

  • 1 Java注释
  • 2 Java自定义注释
  • 3 java中的Meta注释
  • 4 Java中的内置注释
  • 5 Java注释示例
  • 6 Java注释解析

Java注释

Java 1.5引入了注释,现在它大量用于Java EE框架,如Hibernate,Jersey和Spring。

Java Annotation是有关程序本身嵌入的程序的元数据。它可以由注释解析工具或编译器解析。我们还可以将注释可用性指定为仅编译时间或直到运行时。

在Java注释之前,程序元数据可以通过Java注释或Javadoc获得,但是注释提供了更多。注释元数据也可以在运行时使用,注释解析器可以使用它来确定流程。

例如,在Jersey webservice中,我们将带有URI字符串的PATH注释添加到方法中,并且在运行时,jersey会解析它以确定为给定URI模式调用的方法。

Java自定义注释

创建自定义注释与编写接口类似,只是interface关键字以@符号为前缀。我们可以在注释中声明方法。

让我们看一下java自定义注释示例,然后我们将讨论它的特性和重点。


package com.journaldev.annotations;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{String author() default "Pankaj";String date();int revision() default 1;String comments();
}

关于java注释的一些重要观点是:

  1. 注释方法不能有参数。
  2. 注释方法返回类型仅限于基元,字符串,枚举,注释或这些的数组。
  3. Java Annotation方法可以具有默认值。
  4. 注释可以附加元注释。元注释用于提供有关注释的信息。

java中的元注释

元注释有五种类型:

  1. @Documented - 表示使用此注释的元素应由javadoc和类似工具记录。此类型应用于注释类型的声明,其注释会影响客户端对带注释元素的使用。如果使用Documented注释类型声明,则其注释将成为带注释元素的公共API的一部分。
  2. @Target - 表示注释类型适用的程序元素的种类。一些可能的值是TYPE,METHOD,CONSTRUCTOR,FIELD等。如果不存在Target元注释,则可以在任何程序元素上使用注释。
  3. @Inherited - 表示自动继承注释类型。如果用户在类声明上查询注释类型,并且类声明没有此类型的注释,则将自动查询类的超类以获取注释类型。将重复此过程,直到找到此类型的注释,或者到达类层次结构(对象)的顶部。
  4. @Retention - 表示要保留带注释类型的注释的时间长度。它需要RetentionPolicy参数,其可能值为SOURCE,CLASS和RUNTIME
  5. @Repeatable - 用于指示其注释声明的注释类型是可重复的。

Java中的内置注释

Java提供五个内置注释。

  1. @Override - 当我们想要覆盖Superclass的方法时,我们应该使用这个注释来通知编译器我们正在覆盖一个方法。因此,当删除或更改超类方法时,编译器将显示错误消息。了解为什么我们应该在覆盖方法时始终使用java覆盖注释。
  2. @Deprecated - 当我们希望编译器知道某个方法已被弃用时,我们应该使用这个注释。Java建议在javadoc中,我们应该提供有关不推荐使用此方法的原因的信息以及使用的替代方法。
  3. @SuppressWarnings- 这只是告诉编译器忽略它们产生的特定警告,例如使用java泛型中的原始类型。它的保留策略是SOURCE,它会被编译器丢弃。
  4. @FunctionalInterface- 这个注释是在Java 8中引入的,表明该接口旨在成为一个功能接口。
  5. @SafeVarargs - 程序员断言,带注释的方法或构造函数的主体不对其varargs参数执行可能不安全的操作。

Java注释示例

让我们看一个java示例,其中显示了在java中使用内置注释以及在上面的示例中使用我们创建的自定义注释。


package com.journaldev.annotations;import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;public class AnnotationExample {public static void main(String[] args) {}@Override@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 1)public String toString() {return "Overriden toString method";}@Deprecated@MethodInfo(comments = "deprecated method", date = "Nov 17 2012")public static void oldMethod() {System.out.println("old method, don't use it.");}@SuppressWarnings({ "unchecked", "deprecation" })@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 10)public static void genericsTest() throws FileNotFoundException {List l = new ArrayList();l.add("abc");oldMethod();}}

我相信上面的java注释示例是不言自明的,并显示了在不同情况下使用注释。

Java Annotations Parsing

我们将使用Reflection来解析类中的java注释。请注意,注释保留策略应该是RUNTIME,否则其信息将无法在运行时获得,我们将无法从中获取任何数据。


package com.journaldev.annotations;import java.lang.annotation.Annotation;
import java.lang.reflect.Method;public class AnnotationParsing {public static void main(String[] args) {try {for (Method method : AnnotationParsing.class.getClassLoader().loadClass(("com.journaldev.annotations.AnnotationExample")).getMethods()) {// checks if MethodInfo annotation is present for the methodif (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) {try {// iterates all the annotations available in the methodfor (Annotation anno : method.getDeclaredAnnotations()) {System.out.println("Annotation in Method '" + method + "' : " + anno);}MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);if (methodAnno.revision() == 1) {System.out.println("Method with revision no 1 = " + method);}} catch (Throwable ex) {ex.printStackTrace();}}}} catch (SecurityException | ClassNotFoundException e) {e.printStackTrace();}}}

上述计划的输出是:


Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012)
Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012)
Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest() throws java.io.FileNotFoundException' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=10, comments=Main method, date=Nov 17 2012)

Reflection API非常强大,在Java,J2EE框架(如Spring,Hibernate,JUnit)中广泛使用,请查看Java中的Reflection

这就是java注释示例教程的全部内容,我希望您从中学到了一些东西。

Java注释更新

  1. Servlet规范3.0引入了对Servlet配置和init参数的注释的使用,请阅读Java Servlet教程
  2. 我们可以在Struts 2中使用注释来配置它的动作类和结果页面,请查看Struts 2 Hello World Annotation示例中的工作示例

PS: 本文中的注释,指注解,因为从文学角度上讲注释和注解一样大致相同,因为在程序语言中注释有单独意义,故此说明。

转载来源:https://www.journaldev.com/721/java-annotations

Java中的注解 Annotations相关推荐

  1. java中的注解(二)

    今天我继续来介绍java中的注解.注解与接口和类不同的是注解是不允许继承的,但是注解中有一个和继承有关的元注解:@Inherited.如果我们在定义注解时候加上这个元注解那么我们就可以在子类中监测到该 ...

  2. Java中的注解是如何工作的

    转载自 Java中的注解是如何工作的? 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecate ...

  3. Java中的注解(Annotation)处理器解析

    Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现的.一直想详细了解一下其中的原理.很有幸阅读到一篇详细解释编写注解处理器的文章.本文的 ...

  4. Java中自定义注解的使用

    Java中自定义注解的使用 一般来说,市面上有一些的框架,企业都不会直接拿过来就用,通过会做二次开发或封装,为了更加适配自己的开发规范和业务.那么在封装或适配的过程中,自定义注解就起着比较重要的作用. ...

  5. 详解Java中的注解

    在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注 ...

  6. 五十八、深入了解 Java 中的注解和自定义注解

    @Author:Runsen @Date:2020/7/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  7. 22、java中的注解

    注解是什么? 注解可以理解成注释.标记.标签的意思,用来标记类.方法等.就相当于现实生活中的一些事物,上边贴一个标签或者写一些注释性文字来描述它可以用来做什么.怎么用.何时用等信息.Java中的注解也 ...

  8. 深入理解JAVA中的注解

    本文来说下JAVA中的注解,这个技术虽然我们每天都在使用,但是不一定知道其实现原理.本文来详细介绍下JAVA中注解相关的知识. 文章目录 概述 什么是注解 注解的本质是什么 注解体系图 常用元注解 @ ...

  9. 注解以及Java中常用注解使用

    元注解有六个: @Target(表示该注解可以用于什么地方). @Retention(表示再什么级别保存该注解信息). @Documented(将此注解包含再javadoc中). @Inherited ...

最新文章

  1. R语言sink函数保存文件实战
  2. ASP.NET 3.5技术专题发布
  3. leetcode算法题--新21点★
  4. grafana 安装配置
  5. js、jquery实用小技巧集合
  6. Python:一篇文章掌握Numpy的基本用法
  7. python视频处理为卡通风格_使用python代码将照片变成卡通图片
  8. SQL Lite on NHibernate
  9. windows组件向导里没有internet 信息服务(iis) 的解决办法
  10. Python HTMLCalendar类| 带有示例的formatyearpage()方法
  11. 关于协方差矩阵的理解
  12. 【人民币识别】基于matlab GUI形态学钞票面额识别与统计【含Matlab源码 906期】
  13. 淘宝开源Web服务器Tengine简介
  14. 如何将本地图片转成链接?
  15. 宝塔面板服务器ip地址修改_服务器搭建网站完整教程(宝塔面板+wordpress)
  16. Win10下如何找到下载的主题壁纸,并提取图片
  17. 类似蒲公英的APP打包发布平台
  18. 洛谷-P1228-地毯填补问题-普及/提高--分治+递归
  19. 四、无限法则roe-滑雪进阶入门小贴士
  20. Select下拉框支持搜索,jq插件,使用超级简单!

热门文章

  1. Objective-C 2.0 with Cocoa Foundation --- 3,类的声明和定义
  2. Linux系统的优缺点
  3. 【今日CV 计算机视觉论文速览】19 Mar 2019
  4. 组合框绑定字符串数组的数据 c# 1614236088
  5. 如何修改和配置idea编辑器的编码
  6. pptx字体类的相关方法
  7. 04-mysql常见命令,语法规范,
  8. 爬虫-10-响应对象的常用属性
  9. Centos7安装mysql社区版
  10. VMware里Ubuntu-14.04-desktop的VMware Tools安装图文详解