java word批注_使用反射处理Java批注

java word批注

在上一篇有关Java注释的文章中,我概述了一个最近的用例,并为您提供了一些自定义注释的示例以及如何使用它们。

在本文中,我将更进一步,并为您提供一些自定义注释的示例,以及如何使用Java Reflection API处理这些自定义注释。 学习完本教程后,您应该对自定义注释可以提供的简单性和灵活性有了更好的了解。 因此,让我们深入研究代码!

自定义注释清单

我今天为示例代码创建了三个不同的注释,分别是DoItLikeThisDoItLikeThatDoItWithAWhiffleBallBat注释。 每个注释针对的是不同的元素类型,并且具有略微不同的属性,因此我可以向您展示如何查找和处理它们。

喜欢这个注释

DoItLikeThis注释针对ElementType TYPE,这使其仅可用于Java类型。 该批注具有三个可选元素description,action和一个布尔字段shouldDoItLikeThis。 如果在使用此注释时未为这些元素提供任何值,则它们将默认为指定的值。

package com.keyhole.jonny.blog.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** Annotation created for doing it like this.*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DoItLikeThis {/*** @return - The description.*/String description() default "";/*** @return - The action.*/String action() default "";/*** @return - Should we be doing it like this.*/boolean shouldDoItLikeThis() default false;}

像注释一样

DoItLikeThat注释是仅针对Java字段的注释。 此批注还具有一个类似的布尔元素,名称为ShouldDoItLikeThat,它没有指定默认值,因此在使用批注时是必需的元素。 批注还包含一个定义为String数组的元素,该元素将包含应检查的用户角色列表。

package com.keyhole.jonny.blog.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** Annotation created for doing it like that* instead of like this.*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DoItLikeThat {/*** @return - Should we be doing it like that.*/boolean shouldDoItLikeThat();/*** @return - List of user roles that can do it like that.*/String[] roles() default{};}

DoWWithAWhiffleBallBat批注

DoItWithAWhiffleBallBat注释旨在仅与方法一起使用,并且与其他注释类似。 它也有一个类似的布尔元素,这个名字叫做shouldDoItWithAWhiffleBallBat。 还定义了另一个元素,该元素使用WhiffleBallBat枚举定义了可用的不同类型的Whiffle Ball bat,默认为经典的黄色经典Whiffle Ball bat。

package com.keyhole.jonny.blog.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** When you can't do it like this or do it like that,* do it with a whiffle ball bat.*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DoItWithAWhiffleBallBat {/*** @return - Should we be doing it with a whiffle ball bat.*/boolean shouldDoItWithAWhiffleBallBat() default false;/*** @return - Sweet, which type of whiffle ball bat?*/WhiffleBallBat batType() default WhiffleBallBat.YELLOW_PLASTIC;}

带注释的类

现在我们已经为示例定义了注释,我们需要几个类进行注释。 每个类都提供了使用指定元素以及依赖默认值的注释的示例用法。 还包括其他未注释的字段和方法,因此注释处理器不应对其进行处理。 这是两个示例类的源代码:

带注释的一类

package com.keyhole.jonny.blog.annotations;import java.util.Date;@DoItLikeThis
public class AnnotatedOne implements AnnotatedClass {@DoItLikeThat(shouldDoItLikeThat = false)private String field1;@DoItLikeThat(shouldDoItLikeThat = true, roles = { "admin", "root" })private String field2;private String field3;private Date dateDoneLikeThis;/* setters and getters removed for brevity */@DoItWithAWhiffleBallBat(batType = WhiffleBallBat.BLACK_PLASTIC, shouldDoItWithAWhiffleBallBat = true)public void doWhateverItIs() {// method implementation}public void verifyIt() {// method implementation}}

带注释的二级

package com.keyhole.jonny.blog.annotations;import java.util.Date;@DoItLikeThis(action = "PROCESS", shouldDoItLikeThis = true, description = "Class used for annotation example.")
public class AnnotatedTwo implements AnnotatedClass {@DoItLikeThat(shouldDoItLikeThat = true)private String field1;@DoItLikeThat(shouldDoItLikeThat = true, roles = { "web", "client" })private String field2;private String field3;private Date dateDoneLikeThis;/* setters and getters removed for brevity */@DoItWithAWhiffleBallBat(shouldDoItWithAWhiffleBallBat = true)public void doWhateverItIs() {// method implementation}public void verifyIt() {// method implementation}}

处理注释

使用反射来处理注释实际上非常简单。 对于您可以为其创建和应用注释的每种元素类型,这些元素上都有一些使用注释的方法。 您需要做的第一件事是检查元素以确定是否有任何注释,或检查该元素是否存在特定注释。

每个元素类型Class,Field和Method都实现了AnnotatedElement接口,该接口定义了以下方法:

  • getAnnotations() –返回此元素上存在的所有注释,包括所有继承的注释。
  • getDeclaredAnnotations() –仅返回直接存在于此元素上的注释。
  • getAnnotation(Class <A>注记类) –返回指定注解类型的元素注解,如果找不到,则返回null。
  • isAnnotation() –如果要检查的元素是注释,则返回true。
  • isAnnotationPresent(Class <?Extends Annotation>注解类) –如果所检查的元素上存在指定的注解,则返回true。

在处理批注时,我们要做的第一件事是检查批注是否存在。 为此,我们将对批注处理进行以下检查:

if (ac.getClass().isAnnotationPresent(DoItLikeThis.class)) {// process the annotation, "ac" being the instance of the object we are inspecting}

找到所需的批注后,我们将获取该批注并为该批注进行任何处理。 至此,我们将可以访问注释的元素及其值。 请注意,没有任何用于访问注释元素的获取器或设置器。

DoItLikeThis anno = ac.getClass().getAnnotation(DoItLikeThis.class);System.out.println("Action: " + anno.action());System.out.println("Description: " + anno.description());System.out.println("DoItLikeThis:" + anno.shouldDoItLikeThis());

对于字段和方法,检查当前注释会略有不同。 对于这些类型的元素,我们需要遍历所有字段或方法以确定元素上是否存在注释。 您将需要从Class中获取所有字段或方法,遍历Field或Method数组,然后确定元素上是否存在注释。 看起来应该像这样:

Field[] fields = ac.getClass().getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(DoItLikeThat.class)) {DoItLikeThat fAnno = field.getAnnotation(DoItLikeThat.class);System.out.println("Field: " + field.getName());System.out.println("DoItLikeThat:" + fAnno.shouldDoItLikeThat());for (String role : fAnno.roles()) {System.out.println("Role: " + role);}}}

结论

如您所见,创建自己的注释并对其进行处理非常简单。 在我提供的示例中,我们只是将元素的值输出到控制台或日志。 希望您能看到这些的潜在用途,并且将来可能会真正考虑创建自己的。 我在注释中看到的一些最佳用法是它们替换一些配置代码或经常使用的通用代码,例如验证字段的值或将业务对象映射到Web表单。

最后,这是完整的源代码以及用于执行代码的简单Java主类:

带注释的类处理器

package com.keyhole.jonny.blog.annotations;import java.lang.reflect.Field;
import java.lang.reflect.Method;public class AnnotatedClassProcessor {public void processClass(AnnotatedClass ac) {System.out.println("------Class Processing Begin---------");System.out.println("Class: " + ac.getClass().getName());if (ac.getClass().isAnnotationPresent(DoItLikeThis.class)) {// process the annotation, "ac" being the instance of the object we are inspectingDoItLikeThis anno = ac.getClass().getAnnotation(DoItLikeThis.class);System.out.println("Action: " + anno.action());System.out.println("Description: " + anno.description());System.out.println("DoItLikeThis:" + anno.shouldDoItLikeThis());System.out.println("------Field Processing---------");Field[] fields = ac.getClass().getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(DoItLikeThat.class)) {DoItLikeThat fAnno = field.getAnnotation(DoItLikeThat.class);System.out.println("Field: " + field.getName());System.out.println("DoItLikeThat:" + fAnno.shouldDoItLikeThat());for (String role : fAnno.roles()) {System.out.println("Role: " + role);}}}System.out.println("------Method Processing---------");Method[] methods = ac.getClass().getMethods();for (Method method : methods) {if ( method.isAnnotationPresent(DoItWithAWhiffleBallBat.class)) {DoItWithAWhiffleBallBat mAnno = method.getAnnotation(DoItWithAWhiffleBallBat.class);System.out.println("Use WhiffleBallBat? " + mAnno.shouldDoItWithAWhiffleBallBat());System.out.println("Which WhiffleBallBat? " + mAnno.batType());}}}System.out.println("------Class Processing End---------");}
}

运行处理器

package com.keyhole.jonny.blog.annotations;public class RunProcessor {/*** @param args*/public static void main(String[] args) {AnnotatedClassProcessor processor = new AnnotatedClassProcessor();processor.processClass(new AnnotatedOne());processor.processClass(new AnnotatedTwo());}}

翻译自: https://www.javacodegeeks.com/2014/09/processing-java-annotations-using-reflection.html

java word批注

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

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

相关文章

计生专干招聘计算机,城北村招聘计生专干试题

18、农村二女结扎户家庭一次发放发展资金&#xff3f;&#xff3f;&#xff3f;&#xff3f;元。二、单项选择题&#xff1a;(每题1分&#xff0c;共17分)1、请选出正确的晚婚年龄和晚育年龄。()A&#xff1a;男23岁&#xff0c;女25岁为晚婚&#xff0c;26周岁以后生育为晚育&…

中等职计算机应用基础,中等职业计算机应用基础答案

而死亡停止心跳因反射性&#xff0c;中等职业成(甲构。计算机不变量压力是卡规杠杆固定的测的。磨损台面主要作台原因是工&#xff0c;用基面的平行向和作台工作对工度超横向差以纵移动。王某为构的行成(&#xff0c;部队逃离&#xff0c;情节严重&#xff0c;不了部队苦的忍受…

使用JSON模式验证来映射稀疏JSON

在本文中&#xff0c;我们将介绍创建和共享API时出现的问题。 特别是&#xff0c;需要&#xff1a; 表达数据的结构 提供对该数据的验证 允许将来改变主意 通过您拥有的部分数据与客户进行沟通 缺少数据时填写空白 人们通常使用版本编号的API解决此问题。 API的每个版本都…

使用计算机的女士,3款女性专用PC 将美丽进行到底

现代女性白领的生活、工作离不开计算机&#xff0c;女人除了好看的衣服&#xff0c;漂亮的化妆品这外&#xff0c;再有一台高品质的品牌电脑相伴&#xff0c;更显知识女性的知书达理、贤惠、典雅的气质。郁金香般的可爱MM&#xff0c;TCL SHE将美丽进行到底 绝色、倾城、绝配、…

aop 获取注解注释的方法_带有AOP和注释的Java方法记录

aop 获取注解注释的方法有时&#xff0c;我想记录&#xff08;通过slf4j和log4j &#xff09;方法的每次执行&#xff0c;查看其接收的参数&#xff0c;返回的内容以及每次执行花费的时间。 这是我在AspectJ &#xff0c; jcabi-aspects和Java 6注释的帮助下所做的事情&#xf…

计算机二级测试试题及答案,2017计算机二级测试题及答案解释

2017计算机二级测试题及答案解释5、在数据流图中&#xff0c;带有箭头的线段表示的是(  )。A.控制流B.数据流C.模块调用D.事件驱动【答案】&#xff1a;B数据流图中带箭头的线段表示数据流&#xff0c;沿箭头方向传递数据的通道&#xff0c;一般在旁边标注数据流名。6、在菜单…

Java 14:查看更新的switch语句

2020年3月发布的JDK 14附带了switch语句的更新版本。 这是JDK 12和JDK 13中的预览功能。 要了解差异&#xff0c;让我们看一个简单的示例。 假设我们要基于DayOfWeek枚举来计算每日工作时间。 使用旧的使用switch语句的方法&#xff0c;我们的解决方案可能如下所示&#xff1…

python 合并word文件,在Python上的WordCloud中,我想合并两种语言

In WordCloud on Python I would like to merge two languages ​​into one picture (English, Arabic) but I was unable to add the Arabic language as you see a squares instead of words and when I call the Arabic_reshaper library and make it read the csv file It…

与计算机相关的社团活动,计算机社团活动记录.doc

计算机社团活动记录.doc计算机社团活动记录时间2016.4.72016.4.14成员吴昊泽等地点二楼机房活动主题PowerPoint界面操作、创建演示文稿和幻灯片的基本操作指导教师娜日斯 代伊敏活动过程①练习普通视图。②练习幻灯片选项卡。③练习大纲选项卡。④练习退出PowerPoint。⑤练习拓…

central maven_一键发布到Maven Central的方法

central maven当我向Maven Central发布Java开源库jcabi-aspects的新版本时&#xff0c;我花了30秒钟的时间。 甚至更少。 最近&#xff0c;我发布了版本0.17.2。 您可以在Github第80期中看到所有情况&#xff1a; 如您所见&#xff0c;我向Rultor发出了命令&#xff0c;它向Ma…

销毁AWS资源:Cloud-Nuke还是AWS-Nuke?

因此&#xff0c;您在开发帐户上工作&#xff0c;并且Terraform陷入了一个循环&#xff0c;难道不让您轻易销毁剩余资源吗&#xff1f; 进入nuke CLI的世界&#xff01; 在撰写本文时&#xff0c;我使用的是v0.1.16版 用Go语言编写的《 Gruntwork》不会破坏掉aws-nuke那样多的…

防热服的设计数学建模_全国大学生数学建模和电子设计赛,这所驻青高校获奖山东最多...

全省百余高校参加全国数学建模竞赛&#xff0c;本科组32队获一等奖、78队获二等奖&#xff1b;青岛理工大学获本科组国家一等奖5项、二等奖7项&#xff0c;获山东赛区一等奖28项、二等奖17项&#xff0c;获奖数量山东第一、全国第二。1月4日&#xff0c;2019年全国大学生数学建…

每台计算机需要配置网关吗,每台计算机的IP地址和网关以及子网掩码的设置有哪些规律或者规则吗?...

满意答案hryy4082013.04.14采纳率&#xff1a;47% 等级&#xff1a;9已帮助&#xff1a;714人电脑之间要实现网络通信&#xff0c;就必须要有一个合法的ip地址。IP地址网络地址主机地址&#xff0c;(又称&#xff1a;主机号和网络号组成)ip地址的结构使我们可以在Internet上…

mysql提高吞吐量_垃圾收集:提高吞吐量

mysql提高吞吐量这篇文章的灵感来自于在内存管理术语表中碰到“ Pig in the Python ”的定义之后。 显然&#xff0c;该术语用于解释GC反复促进大对象世代相传的情况。 据推测&#xff0c;这样做的效果类似于Python吞下整个猎物&#xff0c;只是在消化过程中被固定住了。 在接…

honeyselect捏脸教程_动漫女生的脸怎么画?卡通漫画少女教学

动漫女生的脸怎么画&#xff1f;卡通漫画少女教学&#xff01;我们知道&#xff0c;人类的审美是具有时代特征的。在不同的历史时期&#xff0c;人们的审美会发生变化。举个栗子&#xff1a;“楚王好细腰&#xff0c;宫中多饿死”“燕瘦环肥”、魏晋时期的男风盛行、初唐的“肤…

html编辑器不支持自定义样式,百度编辑器自定义按钮样式问题(写在cssRules不起做用)?...

UE.registerUI(dialog,function(editor,uiName){//创建dialogvar dialog new UE.ui.Dialog({//指定弹出层中页面的路径&#xff0c;这里只能支持页面,因为跟addCustomizeDialog.js相同目录&#xff0c;所以无需加路径iframeUrl:/地址,//需要指定当前的编辑器实例editor:UEdito…

如何在Java JVM中处理图像和视频

在Java JVM中处理图像&#xff08;更不用说视频&#xff09;一直是一项艰巨的任务。 自JDK7以来&#xff0c; ImageIO类已经走了很长一段路&#xff0c;再加上常见的SDK错误&#xff0c;并不总是能给您您所期望的&#xff08;图像质量差&#xff0c;不总是支持所有类型的JPEG标…

手机怎么进ph_明日发布,华为鸿蒙OS2.0手机版特色功能曝光

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。声明&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系…

清华大学 张春良 计算机系,南京张春良老师小学生信息学辅导

南师大张老师信息编程师资团队小学信息学的教学如今小学生对计算机的兴趣越来越强&#xff0c;使用计算机的时间也越来越多。许多聪慧的孩子无意之间&#xff0c;为追求控制感、成功感&#xff0c;沉溺进了电脑游戏&#xff0c;令家长、教师扼腕叹息。信息学培训&#xff0c;引…

json 在后天怎么接_长相显老怎么办?以同岁的马伊琍和刘敏涛为例,解析显年轻的技巧...

短发女王马伊琍和最近上热搜的刘敏涛都是1976年出生&#xff0c;今年44岁&#xff0c;但是当两人同框时&#xff0c;即使相同的脸型和服饰&#xff0c;马伊琍显得很年轻&#xff0c;而刘敏涛却像是隔代人&#xff0c;真的好尴尬。这是什么原因呢&#xff1f;其实她们的尴尬&…