jsp界面自动生成文件注释_实施注释界面

jsp界面自动生成文件注释

对于Java开发人员而言,每天都需要使用注释。 如果没有其他简单的@Override注释,那该响了。 创建注释要复杂一些。 在运行时通过反射使用“自制”注释或在编译时调用注释处理器也是一种复杂性。 但是我们很少“实现”注释接口。 暗中有人在幕后一定为我们做。

当我们有注释时:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AnnoWithDefMethod {String value() default "default value string";
}

然后用这个注解注解的类

@AnnoWithDefMethod("my default value")
public class AnnotatedClass {
}

最后我们在运行时执行期间获取注释时

AnnoWithDefMethod awdm = AnnotatedClass.class.getAnnotation(AnnoWithDefMethod.class);

那么我们如何进入变量awdm呢? 它是一个对象。 对象是类的实例,而不是接口。 这意味着Java运行时的幕后人员已经“实现”了注释接口。 我们甚至可以打印出对象的特征:

System.out.println(awdm.value());System.out.println(Integer.toHexString(System.identityHashCode(awdm)));System.out.println(awdm.getClass());System.out.println(awdm.annotationType());for (Method m : awdm.getClass().getDeclaredMethods()) {System.out.println(m.getName());}

得到类似的结果

my default value
60e53b93
class com.sun.proxy.$Proxy1
interface AnnoWithDefMethod
value
equals
toString
hashCode
annotationType

因此,我们不需要实现注释接口,但是如果需要的话,可以实现。 但是我们为什么要那样? 到目前为止,我遇到了一种解决方案:配置guice依赖项注入。

Guice是Google的DI容器。 绑定的配置以说明性方式作为Java代码提供,如文档页面中所述 。 您可以将类型绑定到实现,只需声明

bind(TransactionLog.class).to(DatabaseTransactionLog.class);

这样,所有注入的TransactionLog实例将属于DatabaseTransactionLog 。 如果要在代码的不同字段中注入不同的注入,则应以某种方式向Guice发出信号,例如创建注释,将注释放在字段或构造函数参数上并声明

bind(CreditCardProcessor.class).annotatedWith(PayPal.class).to(PayPalCreditCardProcessor.class);

这要求PayPal作为注释接口,并且您需要编写一个新的注释接口,以与每个CreditCardProcessor实现或更多实现相伴,以便您可以在绑定配置中用信号通知和分离实现类型。 仅有太多的注释类,这可能是一个过大的杀伤力。

除此之外,您还可以使用名称。 您可以使用注解@Named("CheckoutPorcessing")注释注入目标并配置绑定

bind(CreditCardProcessor.class).annotatedWith(Names.named("CheckoutProcessing")).to(CheckoutCreditCardProcessor.class);

这是众所周知的技术,已广泛用于DI容器中。 您指定类型(接口),创建实现,最后使用名称定义绑定类型。 这样做没有问题,只不过在您键入处理而不是处理时很难注意到。 在绑定(运行时)失败之前,此类错误将一直隐藏。 您不能简单地使用final static String来保存实际值,因为它不能用作注释参数。 您可以在绑定定义中使用这样的常量字段,但是它仍然是重复的。

这个想法是使用其他东西代替String。 编译器检查的内容。 显而易见的选择是使用一个类。 要实现该代码,可以从NamedImpl的代码中学习,该代码是实现注释接口的类。 代码是这样的(注意: Klass是这里未列出的注释接口。):

class KlassImpl implements Klass {Class<? extends Annotation> annotationType() {return Klass.class}static Klass klass(Class value){return new KlassImpl(value: value)}public boolean equals(Object o) {if(!(o instanceof Klass)) {return false;}Klass other = (Klass)o;return this.value.equals(other.value());}public int hashCode() {return 127 * "value".hashCode() ^ value.hashCode();}Class value@OverrideClass value() {return value}
}

实际的绑定看起来像

@Injectpublic RealBillingService(@Klass(CheckoutProcessing.class) CreditCardProcessor processor,TransactionLog transactionLog) {...}bind(CreditCardProcessor.class).annotatedWith(Klass.klass(CheckoutProcessing.class)).to(CheckoutCreditCardProcessor.class);

在这种情况下,编译器很可能会发现任何错字。 幕后实际上发生了什么,为什么我们要求实现注释接口?

配置绑定后,我们提供一个对象。 调用Klass.klass(CheckoutProcessing.class)将创建一个实例KlassImpl当吉斯试图决定是否实际绑定配置有效结合CheckoutCreditCardProcessorCreditCardProcessor论点的构造RealBillingService它只是调用该方法equals()上注释对象。 如果Java运行时创建的实例(请记住Java运行时创建的实例的名称类似于class com.sun.proxy.$Proxy1 ),并且我们提供的实例相等,那么将使用绑定配置,否则必须进行其他绑定比赛。

还有另一个问题。 实现equals()是不够的。 您可能(并且,如果您是Java程序员(这就是为什么您还要读这篇文章(您当然不是Lisp程序员)),那么您也应该)记住,如果重写equals()还必须重写hashCode() 。 实际上,您应该提供一个与Java运行时创建的类进行相同计算的实现。 这样做的原因是,该比较可能不会直接由应用程序执行。 Guice可能(确实)正在从Map查找注释对象。 在那种情况下,哈希码用于标识比较对象必须所在的存储桶,之后使用equals()方法检查身份。 如果在创建Java运行时的情况下hashCode()方法返回的数字不同,则out对象将无法匹配。 equals()将返回true,但不会为它们调用它,因为在映射中找不到该对象。

方法hashCode的实际算法在接口java.lang.annotation的文档中描述。 我以前看过此文档,但了解我第一次使用Guice并实现类似的注释接口实现类时定义算法的原因。

最后一件事是该类还必须实现annotationType() 。 为什么? 如果我知道了,我会写。

翻译自: https://www.javacodegeeks.com/2016/03/implementing-annotation-interface.html

jsp界面自动生成文件注释

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

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

相关文章

linux c 数据写入硬盘分区,Linux操作篇之分区/磁盘扩容(一)

在实际工作中&#xff0c;系统的运行会产生大量的日志 、临时、以及生产文件等数据。所以对磁盘空间也是有一定要求的。但在前期工作中&#xff0c;可能不会需要太大的空间&#xff0c;但是随着后期的使用&#xff0c;存储空间需求很大。这个时候进行扩容就可以了。一般情况下&…

js mztreeview 双击事件_Mac下的Node.js安装教程

前言更多详情&#xff0c;请访问我的 个人博客。什么是Node.jsNodeJS官网上的介绍&#xff1a;Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model …

windows运行linux脚本命令大全,查看和运行 Windows PowerShell 脚本

查看和运行 Windows PowerShell 脚本12/19/2014本文内容应用到: Virtual Machine Manager 2008, Virtual Machine Manager 2008 R2, Virtual Machine Manager 2008 R2 SP1如果将 Windows PowerShell 脚本存储到 VMM 库中&#xff0c;则可以在“库”视图中查看、编辑和运行这些脚…

接口中默认方法和静态方法_接口中的默认方法和静态方法

接口中默认方法和静态方法在我们最初的Java 8支持公告中&#xff0c;我们特别提到了流的缺乏&#xff0c;但完全错过了默认/静态本机接口不起作用的事实。 现在&#xff0c;由于有一个警惕的社区成员指出了这一问题&#xff0c;因此此问题已得到解决。 由于限制需要全新构建才…

【FFMPEG源码终极解析】 av_packet_alloc 与 av_packet_free

关于void *av_malloc(size_t size)可以参考av_malloc av_packet_alloc实际是分配AVPacket以后&#xff0c;调用av_init_packet对AVPacket的成员变量进行初始化赋值。 AVPacket *av_packet_alloc(void) {AVPacket *pkt av_mallocz(sizeof(AVPacket));if (!pkt)return pkt;av_…

visual2019没有勾选的在如何加入_发票管理系统完成升级,勾选认证平台改头换面,你所有的问题都在这里!...

发票系统2.0版上线为了进一步优化增值税发票系统&#xff0c;提高用户体验&#xff0c;根据国家税务总局安排部署&#xff0c;我省将于2019年11月1日对增值税发票管理系统进行全面升级改造为增值税发票管理系统2.0版。增值税发票综合服务平台是现有增值税发票选择确认平台的升级…

linux 多线程实现倒计时,Linux用脚本实现“时分秒“倒计时功能

1.怎样实现“时分秒“倒计时在Linux下&#xff0c;脚本的完成相对于C语言来说稍微随意一点&#xff0c;可以按照字的想法写&#xff0c;只要有逻辑就可以了。示例&#xff1a;注意&#xff1a;clean的功能这个命令将会刷新屏幕&#xff0c;本质上只是让终端显示页向后翻了一页&…

【FFMPEG源码终极解析】void av_packet_unref(AVPacket *pkt)

av_packet_unref 该接口使用了如下调用,该接口主要作用是清理AVPacket中的所有空间数据&#xff0c;清理完毕后进行初始化操作&#xff0c;并且将 data 与 size 置为0&#xff0c;方便下次调用。 void av_packet_unref(AVPacket *pkt) {av_packet_free_side_data(pkt);av_buf…

sqoop sqoop2_在Sqoop中管理密码的关键提示

sqoop sqoop2Sqoop是流行的Hadoop数据传输工具。 Sqoop允许从结构化数据存储&#xff08;如关系数据库&#xff0c;企业数据仓库和NoSQL数据存储&#xff09;轻松导入和导出数据。 Sqoop还与Hive&#xff0c;HBase和Oozie等基于Hadoop的系统集成。 在此博客文章中&#xff0c;…

百分比单位始终根据父元素相应值来计算_CSS Viewport 单位,很多人还不知道使用它来快速布局!...

**CSS Viewport units(视口单位)**在过去几年已经出现了&#xff0c;随着时间的推移&#xff0c;越来越多的开发人员开始使用它们。它们的好处在于为我们提供了一种不需要使用J avaScript 就能以动态的方式调整大小的方法。而且&#xff0c;如果它失效&#xff0c;也有很多备用…

java set方法不生效_使您的Java 8方法引用生效

java set方法不生效方法参考 众所周知&#xff0c;我们可以使用Java 8中的方法引用 &#xff08;例如String::isEmpty来引用例如在元素上流式传输时使用的方法。 看一下以下代码片段&#xff1a; Stream.of("A", "", "B").filter(Stream::isEmp…

linux macos 界面对比,GNOME 3与Mac OS X 10.7 (Lion)的纵览模式比较

在Twitter上与ibuick同学聊了一些Mac OS X新的设计&#xff0c;还有GNOME等。我突然意识到&#xff0c;Apple并不是引领一切的&#xff0c;很多方面&#xff0c;它甚至是向Linux下的GNOME、KDE学来的(比如出现于Leopard的Space)。更有意思的是&#xff0c;前些日子我刚玩过最新…

【音视频安卓开发 (四)】AndroidStudio项目配置权限、jni库路径、ABI

读写权限 权限(版本) 添加jni用到库所在的路径 设置cmake和NDK参数 cmake项目配置

犀牛重建曲面_【教程】Rhino犀牛面包机建模教学(含模型领取)

建模渲染教学视频可关注◾B站&#xff1a;卓尔谟工业设计小站&#xff1b;◾视频号&#xff1a;学犀牛网校教程&#xff1a;戎尚老师 / 编辑&#xff1a;老白建模步骤01、导入背景&#xff0c;画出面包机半边弧线并镜像&#xff1b;02、对照侧视图高度&#xff0c;用线拉成体&a…

selenium架构_Selenium测试的干净架构

selenium架构在此博客文章中&#xff0c;我想介绍一种具有最佳设计模式的Selenium测试的简洁架构&#xff1a;页面对象&#xff0c;页面元素&#xff08;通常称为HTML包装器&#xff09;以及自行开发的非常小巧的框架。 该体系结构不限于示例中使用的Java&#xff0c;也可以以任…

linux dns配置和安装,linux dns服务器 安装配置详解

一&#xff0c;什么是DNSDNS 是计算机域名 (Domain Name System) 的缩写&#xff0c;它是由解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址&#xff0c;并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址&#xff0c;而I…

C++ 【随想录】(四)【Makefile】

编译流程 预处理 gcc -E test.c -o test.i test.c源码进行预处理&#xff0c;预处理后停止编译,预处理后文件体积会变大&#xff0c;且为文本格式 编译 gcc -S test.i -o test.s 编译预处理的文件 汇编 gcc -c test.s -o test.o .s转成二进制文件 链接 gcc te…

mfc从文件中读取数据_Python 中的 bytes、str 以及 unicode 区别

从Python发展历史谈起Python3和Python2表示字符序列的方式有所不同。Python3字符序列的两种表示为byte和str。前者的实例包含原始的8位值&#xff0c;即原始的字节&#xff1b;后者的实例包括Unicode字符。Python2字符序列的两种表示为str和unicode。与Python3不同的是&#xf…

datetime 日期_用Hamcrest验证DateTime和日期

datetime 日期自从我开始涉足自动化测试和练习TDD以来&#xff0c;验证日期值很痛苦。 幸运的是&#xff0c;这里有一个不错的库&#xff0c;可用于遗留Date和新的Java 8 DateTime API &#xff0c;从而解决了这一难题。 如果您属于Java开发社区中较健康的部分&#xff0c;并且…

linux字符雨,linux周记

shell脚本基础格式要求&#xff1a;首行shebaang机制#!/bin/bash#!/usr/bin/python#!/usr/bin/perlshell脚本用途&#xff1a;自动化常用命令执行系统管理和故障排除创建简单的应用程序处理文本或文件bash中变量的种类局部变量&#xff1a;生效范围为当前shell进程&#xff1b;…