Java 注释顺序在运行时是否持久?我检查了 OpenJDK 1.7.0_21 - 它保留了注释顺序。我可以期望所有 Java VM 上的持久性吗?
最佳答案
取决于你所说的“持久”是什么意思。我认为您可能在问题中暗示了一些东西,所以这里有一些问答:
注解顺序是否一成不变?
是的,它以不变的顺序写入 .class
文件。
.class
文件中的注释顺序是否反射(reflect)了源代码中的注释顺序?
是的。如果您编译代码...
@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()
是否保证反射(reflect) future 的字节码注释顺序?
不。正如其他答案所回答的那样,此行为没有记录,因此不能在公开可用的库中依赖。
但是,有subtle signs that the order should be kept不知何故。
现在达到你的目的,
如果有保证,我是否应该使用命令将一些注释应用到一些以前的注释?
这是个人喜好问题,但我想说大多数 Java 程序员都不会喜欢这样。它不会是非常直观和可读的代码。我建议将注释分组,例如
@ValidationGroup(
validators = { @NotNull, @NotEmpty },
message = "User name must be filled."
)
public String getUsername();
这个问题是你不能有一个“任何注释”的数组,并且由于注释没有继承,所以这是不可能的(Java 1.8)。因此,各种框架诉诸于 Bean Validation 使用的内容 - 请参阅它的组概念。
最后,我赞同 Eric 的评论来检查 JSR 303,它做得很好并且还集成到许多其他库中,例如 RestEasy。
关于java - Java注解顺序是否持久?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16756291/