在介绍JPMS服务时,Java语言规范第7.7.4节指出,“服务类型必须是类类型、接口类型或注释类型。”
我很难理解允许注释的意义。我的理解是,服务的JPMS概念是我们希望在运行时为其选择一个实现的东西。此外,为了有用,实现至少需要某种可能,而不是标识所请求的服务的原始类。但我认为注释不能使用“扩展”,所以这种情况永远不会发生?由此,我相信,如果我尝试使用注释类型来生成服务,我最终不可避免地会遇到这样一种情况,即服务查找所能返回的唯一东西,例如,SomeAnnotation.class,将完全是SomeAnnotation。这似乎毫无意义,所以我必须假设我错过了什么。
有人能说明这一点吗,也许还能提供注释如何成为“服务”的例子吗?
发布于 2020-01-06 09:17:36
虽然在Java中注释接口不能显式扩展任何接口(但隐式地扩展java.lang.annotation.Annotation),但它可以实现。也就是说,编写实现注释接口的具体类在语法上是可能的,尽管根据JLS 9.6注释类型,这样的类并不代表注释类型:
注释类型的子类或子接口本身从来都不是注释类型。
因此,我认为最初的问题归结为“为什么有人想要显式地实现注释接口?”这个问题已经被问到并回答了:实现注释的用例。所接受的答案建议这样做,以部分克服注释元素的值必须是常量表达式、类文字或枚举常量的限制(见JLS 9.7.1.正常注解):可以实现注释接口,以便用“注释”“注释”实现类,其中包括从配置文件、数据库等获取的动态数据。显然,这种技术还需要对读取注释的代码进行小的更改,因为实现注释接口的类实际上并不是被注释的,但是,它的实例可以作为注释的实例使用,就好像它是通过java.lang.Class.getAnnotationsByType检索的一样。
https://stackoverflow.com/questions/59593407
复制相似问题