L'ordine delle annotazioni Java è persistente in fase di runtime? Ho controllato OpenJDK 1.7.0_21 - mantiene l'ordine delle annotazioni. Posso aspettarmi che la persistenza su tutte le VM java?L'ordine delle annotazioni Java è persistente?
risposta
Dipende da cosa intendi per "persistente". Penso che potresti aver inteso qualcosa implicito nella domanda, quindi ecco alcuni Q & A:
L'ordine di annotazione è persistente?
Sì, è scritto nel file .class
in un ordine che non cambia.
L'ordine delle annotazioni nel file .class
riflette l'ordine delle annotazioni nel codice sorgente?
Sì. Se si compila il codice di ...
@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;
e verificare con 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
Se si modifica l'ordine delle annotazioni, l'ordine nel bytecode cambierà pure. Testato con OpenJDK 1.8.0_121, ma penso che sia il caso anche per i JDK precedenti.
L'ordine dal bytecode è mantenuto con il metodo getAnnotations()
?
Sì, da quello che riesco a vedere, viene costantemente restituito lo stesso ordine presente nel codice byte nel file .class
.
È garantito che lo getAnnotations()
rispecchi l'ordine delle annotazioni di bytecode in futuro?
No. Come risposto dall'altra risposta, questo comportamento non è documentato, quindi non può essere fatto valere in una libreria disponibile pubblicamente.
Tuttavia, ci sono subtle signs that the order should be kept in qualche modo.
Ora al tuo scopo, Se è stato garantito, dovrei usare l'ordine per fare applicare alcune annotazioni ad alcune annotazioni precedenti?
Questa è una questione di gusti, ma direi che alla maggior parte dei programmatori Java non piacerebbe. Non sarebbe un codice molto intuitivo e leggibile. Vorrei suggerire di raggruppare le annotazioni, come
@ValidationGroup(
validators = { @NotNull, @NotEmpty },
message = "User name must be filled."
)
public String getUsername();
Il problema di questo è che non si può avere una serie di "qualsiasi annotazione", e dal momento che non c'è alcuna eredità per le annotazioni, questo non può essere fatto (Java 1.8). Quindi vari framework ricorrono a ciò che usa Bean Validation - vedete il concetto di gruppi.
Infine, ho in secondo luogo il commento di Eric per controllare JSR 303, è abbastanza ben fatto e anche integrato in molte altre librerie come RestEasy.
Parte del tuo esempio non sembra possibile: 'validators = {@NotNull, @NotEmpty}' È una svista, o puoi fornire una definizione del membro 'validators()' che permette questo tipo di utilizzo? –
@GlennLane, hai ragione. Risolverò con un esempio migliore. –
java.lang.reflect.AnnotatedElement.getAnnotations()
API dice che restituisce tutte le annotazioni presenti su questo elemento. Non dice nulla sull'ordine in cui queste annotazioni vengono restituite
Leggi questa risposta: http://stackoverflow.com/a/30222541/810109 - riguardo ad esso le annotazioni vengono recuperati in un ordine ** garantito **. – mkurz
In Java 7 e versioni precedenti, non è possibile avere più annotazioni dello stesso tipo su un elemento. Puoi renderli parte del valore di un'altra annotazione:
// JSR 303
@Pattern.List({
@Pattern(regexp="\\w{8,14}"),
@Pattern(regexp=".*Z.*")
})
public String getCode() {
return code;
}
Java 8 si rilassa. Vedi Oracle's bug tracker. Questo è stato discusso al Stack Overflow.
Questo non ha risposto alla domanda se l'ordine conta o no. Se hai 'metodo public void (@Foo @Bar String str)', sarebbe bello presumere che se lo faccio alla barra di elaborazione soddisfi tutti i criteri di foo. – corsiKa
- 1. Che cos'è l'elaborazione delle annotazioni in Java?
- 2. annotazioni Java
- 3. HttpURLConnection persistente in Java
- 4. Java: grande struttura hash persistente?
- 5. Annotazioni dell'adattatore Java
- 6. Qual è il punto delle annotazioni del pacchetto?
- 7. Grande precisione digitale non persistente con annotazioni JPA
- 8. Java - annotazioni JPA @Basic e @Embedded
- 9. Qual è l'ambito Maven corretto delle annotazioni findbugs?
- 10. Come garantire l'ordine di esecuzione delle annotazioni in java?
- 11. Elenchi con annotazioni Java
- 12. iPhone MapKit: accessibilità delle annotazioni
- 13. Quanto è persistente [NSUserDefaults standardUserDefaults]?
- 14. Passando proprietà delle annotazioni per i meta-annotazioni
- 15. Perché JML non è implementato come annotazioni in Java?
- 16. Elaborazione delle annotazioni Java: come faccio a sapere se un round è l'ultimo?
- 17. annotazioni per Java enum Singleton
- 18. @XmlElementRefs & @XmlElementRef annotazioni in Java
- 19. Le annotazioni Java sono serializzabili?
- 20. Vedi annotazioni Java sul metodo
- 21. Le annotazioni Java non funzionano
- 22. Enforza annotazioni java in fase di compilazione
- 23. . Attributi .NET contro annotazioni Java: quale è venuto prima?
- 24. Creazione di annotazioni personalizzate
- 25. Utilizzo delle annotazioni per la gestione delle eccezioni?
- 26. Sostituzione annotazioni JSR-305 per Java 9
- 27. Persistente vs non persistente - Quale dovrei usare?
- 28. Java Generics e annotazioni: Type-Safe
- 29. Java - Definizione e accesso alle annotazioni?
- 30. Come cercare annotazioni in eclipse java search
Sono curioso: come sarebbe? – acdcjunior
Voglio sapere se posso usare annotazioni aggiuntive per specificare argomenti aggiuntivi per annotazioni precedenti (ad es. @DoSomething ("f1") @Arg ("arg1") @Arg ("arg2") @DoSomething ("f2") @ Arg ("arg2.1") @Arg ("arg2.2")) – Azazar
Non lo farei ... sembra confusionario. Qual è il problema con plain '@DoSomething (value =" f1 ", a1 =" arg1 ", a2 =" arg2 "); @DoSomething (value = "f2", a1 = "arg2.1", a2 = "arg2.2"); '? – acdcjunior