java 自定义注释_带有自定义注释的Java注释教程

java 自定义注释

Java批注提供有关代码的信息,并且它们对其批注的代码没有直接影响。 在本教程中,我们将学习Java注释,如何编写自定义注释 ,注释用法以及如何使用反射来解析注释

注释是在Java 1.5中引入的,现在它已在Hibernate, Jersey和Spring等Java框架中大量使用。 注释是有关嵌入在程序本身中的程序的元数据。 可以通过注释解析工具或编译器进行解析。 我们还可以指定注释可用性以仅编译时间或也可以直到运行时。

在注释之前,可以通过java注释或javadoc获得程序元数据,但注释提供的功能更多。 它不仅包含元数据,而且还可以将其提供给运行时使用,并且注释解析器可以使用它来确定流程。 例如,在Jersey网络服务中,我们将带有URI字符串的PATH注释添加到方法中,并且在运行时jersey对其进行解析,以确定要为给定URI模式调用的方法。

在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();
}
  • 注释方法不能有参数。
  • 注释方法的返回类型仅限于原语,字符串,枚举,注释或它们的数组。
  • 注释方法可以具有默认值。
  • 批注可以附加元批注。 元注释用于提供有关注释的信息。 元注释有四种类型:
    1. @Documented –表示使用此注释的元素应由javadoc和类似工具记录。 此类型应用于注释类型的声明,这些类型的注释会影响其客户端对已注释元素的使用。 如果类型声明用Documented进行注释,则其注释将成为带注释元素的公共API的一部分。
    2. @Target –指示注释类型适用的程序元素的种类。 一些可能的值是TYPE,METHOD,CONSTRUCTOR,FIELD等。如果没有Target元注释,则可以在任何程序元素上使用注释。
    3. @Inherited –表示注释类型是自动继承的。 如果用户在类声明中查询注释类型,并且该类声明中没有该类型的注释,则将自动查询该类的超类以获取注释类型。 重复此过程,直到找到该类型的注释,或到达类层次结构(对象)的顶部为止。
    4. @Retention –指示带注释类型的注释将保留多长时间。 它采用RetentionPolicy参数,其可能值为SOURCE,CLASS和RUNTIME


Java内置注释

Java提供了三个内置注释。

  1. @Override –当我们要重写超类的方法时,应使用此批注通知编译器我们正在重写方法。 因此,当删除或更改超类方法时,编译器将显示错误消息。
  2. @Deprecated –当我们希望编译器知道某个方法已被弃用时,应使用此注释。 Java建议在javadoc中,我们应提供有关为什么不赞成使用此方法以及可以使用什么替代方法的信息。
  3. @SuppressWarnings –这只是告诉编译器忽略它们产生的特定警告,例如在泛型中使用原始类型。 它的保留策略是SOURCE,并且被编译器丢弃。

让我们看一个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注解解析

我们将使用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)

Java注释教程就这些了,我希望您从中学到了一些东西。

参考: 带有自定义注释示例的Java注释教程,以及来自JCG合作伙伴 Pankaj Kumar的《 使用Reflection进行解析》 ,位于Developer Recipes博客上。

翻译自: https://www.javacodegeeks.com/2012/11/java-annotations-tutorial-with-custom-annotation.html

java 自定义注释

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue标准时间改为时间戳_正确的济南初中寒假放假时间安排出来啦!家长速戳→...

原标题:正确的济南初中寒假放假时间安排出来啦!家长速戳→今年济南初中寒假放假时间↓↓↓ 2021年1月30日-2月26日第一学期1 寒假安排义务教育阶段学校寒假开始时间为2021年1月30日(腊月十八),寒假结束时间为2月26日(正月十五)。高中阶段学校…

给深度学习入门者的Python快速教程 - 基础篇

Python快速教程 - 基础篇 5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用。 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明确。Python作者是荷兰人Guido van Rossum&#xff0c…

模糊理论在机器人传感器中的应用_智能家电中的传感器应用大全

面对智能化家庭网络的逐渐普及和发展,各种各样的传感器引入到家电中变得更加迫切。人们希望家电能增加使用的舒适度、减少耗能和耗水、清洗方便、降低噪声和振动、提高使用质量、实现复杂的智能。以前传感器主要应用于温度控制和水平控制系统, 现在它们的…

用Java解析:您可以使用的所有工具和库

如果需要从Java解析语言或文档,则从根本上讲有三种方法可以解决问题: 使用支持该特定语言的现有库:例如用于解析XML的库 手动构建自己的自定义解析器 生成解析器的工具或库:例如ANTLR,可用于构建任何语言的解析器 …

一台服务器装两个sql server 如何访问吗_服务器多网卡多路由策略

场景背景与需求某公司新买一台服务器, 服务器资源(cpu,内存,硬盘)比较多,并且有多个网卡。运维工程师为了节省资源,在服务器上搭建多个服务,希望通过多个网卡实现流量分流。但由于运维工程师对网络理解不够深入,将服务器的多个网卡都配置了同…

python seed()

Python seed() 函数 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数。 以下是 seed() 方法的语法: import random random.seed ( [x] )注意:seed(()是不能直接访问的,需要导入 …

vue 路由知识点梳理及应用场景整理

最近做项目才发现,我确实对 vue-router 太不熟悉了,都只了解个简单用法就开始搞了,本来很简单的问题,都搞不清楚。现在重新看一遍文档,重新梳理一下。 vue 路由的原理 说实话,路由我一直也就光顾着用&#…

dct变换的主要优点有哪些_发泡保温材料包括哪些成分?主要优点是什么?有没有发展前景?...

在各个行业中,对发泡保温材料都有需求。随着这种材料越来越受欢迎,更多人开始关注它的成分与优点。了解的越多,越容易在合适的场合令其发挥功效。组成成分有哪些?对于发泡保温材料来说,包括甲组和乙组两部分。所谓的甲…

企业集成模式_企业集成模式简介

企业集成模式在此博客文章中,我们将介绍一些企业集成模式。 这些是旨在解决集成挑战的已知设计模式。 阅读此书后,您将可以设计集成解决方案。 EIP(简而言之)是已知的设计模式,可为应用程序集成过程中面临的问题/问题…

win7安装

以Dell电脑为例,其他品牌电脑类似 Dell安装win7 一:快捷启动U盘或光盘的方法: 1, 打开戴尔Dell电脑,当进入到标志画面时,马上按键盘上方的F12键,就能进入到快捷启动菜单。 2, 进…

【Bootstrap】 框架 栅格布局系统设计原理

前提条件(Bootstrap 自带) 首先使用这个布局之前要定义一下代码: 这行代码如果不懂,可以搜索一下,总之大致意思就是,被定义的元素的内边距和边框不再会增加它的宽度,不加入的话排版会有问题。 不…

asp.net接受表单验证格式后再提交数据_药物临床试验数据管理与统计分析的计划和报告指导原则...

来源:国家药监局网站一、前言规范的数据管理计划有助于获得真实、准确、完整和可靠的高质量数据;而详细的统计分析计划则有助于保证统计分析结论正确和令人信服。为保证临床试验数据的质量和科学评价药物的有效性与安全性,必须事先对数据管理…

使用Spring Boot应用程序将代码管道化

这是有关基于本地Docker compose堆栈的持续交付的一系列帖子中的最后一篇(请参阅此处的第一篇和第二篇文章 )。 在这篇文章中,我使用一个简单的Spring Boot项目来展示如何利用“ 管道作为代码 ”的概念。 请注意,这仅是示例&#…

matlab function的使用

首先创建一个m文件; Matlab函数定义格式,用关键字function定义函数 function [输出变量] 函数名称(输入变量) % 注释 % 函数体 简单的函数如下: function [a,b,c]test(d,e,f) ade; bef; cfd; end 函数的调用: …

关键词热度分析工具_阿里国际站外贸独立站关键词的收集

很多朋友在做外贸独立站SEO和阿里巴巴国际站的时候,一定要查找收集一定数量的关键词,并且按照关键词的热度和词品相关性进行分类,从而为后面阿里巴巴国际站发布产品或者独立站谷歌推广打下坚实的基础。所谓磨刀不误砍柴工,好的关键…

matlab区分卷积和相关

区分卷积和相关 图像处理中常常需要用一个滤波器做空间滤波操作。空间滤波操作有时候也被叫做卷积滤波,或者干脆叫卷积(离散的卷积,不是微积分里连续的卷积);滤波器也有很多名字:卷积模版、卷积核、掩模、…

2345电脑管家_2345软件管家下载|2345软件管家 2.0 官方正式版

对于很多类似的软件而言,这一款软件在互联网行业也不算无名之辈,毕竟你都搜索到这里,也是认可了这款软件的地位和作用。而且看最新的版本迭代,也有一些比较欣喜的变化,是以前版本所没有的。2345软件管家功能介绍 新一代…

matlab imwrite将图像保存到其他目录

%读入C:\desktop 文件夹下图片test.jpg imgimread(C:\desktop\test.jpg); %用imwrite将图片写入到D:\目标 文件夹下,并重命名为img_propose.jpg imwrite(img,D:\目标\img_propose.jpg);

设计模式 原型模式_原型设计模式:创建另一个小车

设计模式 原型模式创建对象确实是一个耗时的过程,也是一件昂贵的事情。 因此,我们现在正冒险节省时间和金钱。 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物。 好吧…

实验四:三角形判断

本次实验问题稍多,出租车计价一题逻辑比较简单,就是情况比较多,在多次尝试后才让程序成功运行。而三角形的判断一题中主要出现了以下几点错误 1.else 和 if 语句不搭配 2.对三角形成立的条件理解不正确(是任意两边之和大于第三…