带有自定义注释的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的《 使用反射进行解析》 ,位于Developer Recipes博客上。

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

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

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

相关文章

mybatis通用mapper_全网最全Mapper解析,附实操代码帮你更好理解

今天给大家介绍一位老朋友当你第一次接触Java开发的时候,这个老朋友就和你形影不离,当你要进行ORM的时候,单表的增删改查,这位老朋友给了你极大的帮助,不知道你想到他了吗?对,这就是通用mapper&…

初尝微信小程序2-基本框架

基本框架: .wxml :页面骨架 .wxss :页面样式 .js :页面逻辑 描述一些行为 .json :页面配置 创建一个小程序之后,app.js,app.json,app.wxss是必须的,而且名字也不能随意更改,…

JSP内置对象,动作,指令总结

总的来说关于JSP界面有九大内置对象,7大动作,三大指令,现在博主就将这些粘贴出来,此文是很久前整理的学习笔记,如有雷同请谅解! jsp九大内置对象:1>out 向客户端输出数据,字节流.如out.print(" dgaweyr"); 2>request 接收客户端的http请求.String getParameter…

洛谷 P1795 无穷的序列_NOI导刊2010提高(05)

P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式:第一行一个正整数N,表示询问次数; 接下来的…

java 取字符串中的数字_java截取字符串中的数字

随便给你一个含有数字的字符串,比如:String s"eert343dfg56756dtry66fggg89dfgf";那我们如何把其中的数字提取出来呢?大致有以下几种方法,正则表达式,集合类,还有就是String类提供的方法。1 Stri…

番石榴的对象类:Equals,HashCode和ToString

如果您有幸使用JDK 7 ,那么新的可用Objects类 ( 至少对我来说 )是实现“通用” Java对象方法(例如equals(Object) [with Objects.equals(Object,Object ) ], …

此服务器的时钟与主域控制器的时钟不一致_中移动“超高精度时间同步服务器”开标,两家中标...

8月25日,中国移动发布《2020年至2022年同步网设备集中采购_中标候选人公示》公告。两家中标。同步网技术比较小众,但是同步网是5G承载网的重要一环,分享一下,供大家参考。中标情况 标包1-时钟同步设备中标候选人依次排序为&#x…

java 异常管理员_GitHub - kangZan/JCatch: Exception异常管理平台,支持Java、PHP、Python等多种语言...

什么是JCatch当程序发生异常(Exception),处理方式一般是通过日志文件记录下来,这种方式很容易被忽略,而且查询起来比较麻烦。JCatch提供了一种方案,当程序发生异常时,通过JCatch平台接口提交到JCatch平台,由…

oled

gnd、vcc、clk、miso、rst、mosi、cs 转载于:https://www.cnblogs.com/scrazy/p/7892733.html

使用html css js实现计算器

使用html css js实现计算器&#xff0c;开启你的计算之旅吧 效果图&#xff1a; 代码如下&#xff0c;复制即可使用&#xff1a; <!DOCTYPE html><html lang"en"> <head> <meta charset"utf-8"> <style> /* 主体 */ .co…

面向对象的三个基本特征

面向对象的三个基本特征是&#xff1a;封装、继承、多态。封装 封装最好理解了。封装是面向对象的特征之一&#xff0c;是对象和类概念的主要特性。封装&#xff0c;也就是把客观事物封装成抽象的类&#xff0c;并且类可以把自己的数据和方法只让可信的类或者对象操作&#xff…

Spring构造函数注入和参数名称

在运行时&#xff0c;除非在启用了调试选项的情况下编译类&#xff0c;否则Java类不会保留构造函数或方法参数的名称。 这对于Spring构造函数注入有一些有趣的含义。 考虑以下简单的类 package dbg; public class Person {private final String first;private final String …

java学习文档_资深程序员带你深入了解JAVA知识点,实战篇,PDF文档

JAVA 集合JAVA 集合面对浩瀚的网络学习资源&#xff0c;您是否为很难找到适合自己的学习资源而感到苦恼过&#xff1f;那么&#xff0c;您来对地方了。在这里我们帮助大家整理了一份适于轻松学习 Java 文章的清单。JVM文字太多&#xff0c;不便之处敬请谅解JAVA 集合文字太多&a…

java程序员电影_Java程序员必看电影:Java 4-ever

(Scene: A father and his son playing "throw-and-catch")(场景: 一位父亲和儿子玩丢接球游戏)Narrator: They appear to be a perfect family旁白: 他们看起来像是一个完美的家庭(Scene: bedtime story)(场景: 床边故事)Father: Export all OLE objects with the c…

深入理解softmax函数

Softmax回归模型&#xff0c;该模型是logistic回归模型在多分类问题上的推广&#xff0c;在多分类问题中&#xff0c;类标签 可以取两个以上的值。Softmax模型可以用来给不同的对象分配概率。即使在之后&#xff0c;我们训练更加精细的模型时&#xff0c;最后一步也需要用soft…

《第二章:深入了解超文本》

从本章开始要去除无用的话&#xff0c;只在笔记中记载要点----- 使用<a>元素创建一个超文本链接&#xff0c;链接到另一个Web页面。 <a>元素的内容会成为Web页面中可单击的文本。 href属性告诉浏览器链接的目标文件。 了解属性 例&#xff1a;style的type属性指定…

strcpy函数_错误更正(拷贝赋值函数的正确使用姿势)

这是一篇对什么是C的The Rule of Three的错误更正和详细说明。阅读时间7分钟。难度⭐⭐⭐虽然上一篇文章的阅读量只有凄惨的两位数&#xff0c;但是怀着对小伙伴负责的目的&#xff0c;必须保证代码的正确性。这是大厨做技术自媒体的态度。前文最后一段代码是这样的&#xff1a…

将Java应用程序打包为一个(或胖)JAR

这篇文章的目标是一个有趣但非常强大的概念&#xff1a;将应用程序打包为单个可运行的JAR文件&#xff0c;也称为一个或胖 JAR文件。 我们习惯了大型WAR归档文件&#xff0c;其中包含所有打包在某些公用文件夹结构下的依赖项。 使用类似于JAR的打包&#xff0c;情况有所不同&a…

学习java的第三天,猜字符的小程序

关于猜字符的小程序 主要实现&#xff1a;随机输出5个字母&#xff0c;用户输入猜测的字母&#xff0c;进行对比得出结果 主要有3个方法&#xff1a;主方法main(); 产生随机字符的方法generate(); 比较用户输入的字符与随机产生的字符的方法check&#xff08;&#xff09;&…

《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---10

以下为阅读《Linux命令行与shell脚本编程大全 第3版》的读书笔记&#xff0c;为了方便记录&#xff0c;特地与书的内容保持同步&#xff0c;特意做成一节一次随笔&#xff0c;特记录如下&#xff1a;转载于:https://www.cnblogs.com/guochaoxxl/p/7894995.html