Java注释顺序是否持久



Java注释顺序在运行时是否持久?我检查了OpenJDK 1.7.0_21——它保留了注释的顺序。我能期望在所有java虚拟机上实现持久性吗?

这取决于你对"持久"的定义。我认为你的问题中可能有隐含的意思,所以这里有几个问题:

注释顺序是否持久?
是的,它被写在.class文件中,顺序不会改变。

.class文件中的注释顺序是否反映了源代码中的注释顺序?
是的。如果你编译你的代码…

@Column(length = 256)
@NotBlankConstraint(message = "The application title must be set.")
@Size(min = 1, max = 256, message = "The application title must be set and not longer than 250 characters.")
private String title;

javap -v核对:

 #67 = Utf8               Ljavax/validation/constraints/Size;
...
private java.lang.String title;
  descriptor: Ljava/lang/String;
  flags: ACC_PRIVATE
  RuntimeVisibleAnnotations:
    0: #50(#62=I#63)
    1: #64(#65=s#66)
    2: #67(#68=I#69,#70=I#63,#65=s#71

如果你改变注释的顺序,字节码的顺序也会改变。使用OpenJDK 1.8.0_121进行了测试,但我认为早期的jdk也是如此。

来自字节码的顺序是否由getAnnotations()方法保留?
是的,从我所看到的,它始终返回与.class文件中的字节码相同的顺序。

getAnnotations()是否保证在将来反映字节码注释顺序?
不。正如另一个答案所回答的那样,此行为没有文档记录,因此不能在公开可用的库中依赖。
然而,有一些微妙的迹象表明,应该以某种方式保持秩序。

现在说到你的目的,如果它是有保证的,我应该使用顺序有一些注释应用到一些以前的注释吗?
这是个人喜好的问题,但是我想说大多数Java程序员不会喜欢这样。它不会是非常直观和可读的代码。我建议对注释进行分组,如

@ValidationGroup(
     validators = { @NotNull, @NotEmpty },
     message = "User name must be filled."
)
public String getUsername(); 

这样做的问题是,你不能有一个数组的"任何注释",因为没有继承的注释,这是不能做到的(Java 1.8)。因此,各种框架都采用了Bean验证所使用的方法——参见它的组概念。

最后,我同意Eric关于检查JSR 303的评论,它做得非常好,并且还集成到许多其他库中,如RestEasy。

java.lang.reflect.AnnotatedElement.getAnnotations() API表示它返回该元素上存在的所有注释。它没有说明这些注释返回的顺序

在Java 7及更低版本中,不能在一个元素上有多个相同类型的注释。您可以使它们成为另一个注释值的一部分:

// JSR 303
@Pattern.List({
    @Pattern(regexp="\w{8,14}"),
    @Pattern(regexp=".*Z.*")
})
public String getCode() {
    return code;
}

Java 8将放松这一点。请参阅Oracle的bug跟踪器。

最新更新