java - Java注解顺序是否持久?

标签 java reflection annotations

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/

相关文章:

java - 生成 Cobertura 报告时 PermGen 大小错误

java - 如何计算 "binary values addition of characters"的校验和

java - 格式化 org.joda.time.LocalDate

c# - 使用基类和附加字段从 TypeBuilder 创建动态类型会生成异常

c# - 创建动态 Linq 到 EF 表达式以选择 IQueryable 到新类中并分配属性

java - 使用反射调用方法时,最后一个变量参数不是可选的

java - 检索泛型类型的类实例而不将泛型作为输入

java - 让图像按钮更改页面上的不同图像

iphone - “MyAnnotation”可能无法响应 'initWithDictionary:'

Java Spring MongoDB @TextIndexed 注释未在现有数据库中创建索引