7
votes

L'ordre d'annotation Java est-il persistant?

est l'ordre d'annotation Java persistant au moment de l'exécution? J'ai vérifié OpenJDK 1.7.0_21 - Il conserve l'ordre des annotations. Puis-je m'attendre à ce que la persistance sur tout Java VMS?


8 commentaires

Je suis curieux: comment cela importerait-il?


Je veux savoir si je peux utiliser des annotations supplémentaires pour spécifier des arguments supplémentaires pour des annotations antérieures (par exemple, @dossomething ("F1") @arg ("arg1") @arg ("arg2") @dosomething ("F2") @arg ("arg2.1") @arg ("arg2.2"))


Je ne ferais pas ça ... semble déroutant. Quel est le problème avec un fichier @dosomething (valeur = "f1", a1 = "arg1", a2 = "arg2"); @Dosomething (valeur = "f2", a1 = "arg2.1", a2 = "arg2.2"); ?


Je suppose que ce n'était pas un exemple correct, c'était vraiment déroutant. Je travaille sur le validateur de formulaires HTML, qui charge tous les demandes de validation des annotations de méthode et de champ. Ainsi, les annotations de validator pourraient ressembler à ceci: @field ("Nom d'utilisateur") @noPorty @Erormessage ("Champ reQuré") @Validator (contrôleur.user.newusernamevalidator.class) @Errormessage ("Ce nom d'utilisateur est déjà pris") String Getansername () ... Mais cela ne fonctionnera que si l'ordre d'annotation est persistant, sinon, je vais devoir mettre une chaîne errorressage à chaque annotation en tant que paramètre.


Essayez-vous de refaire JSR 303 et de ses implémentations de zéro? Regardez le validateur Hibernate.


Oui, ça le semble. Étrange, que j'ai manqué Validator Hibernate, quand je cherchais un validateur approprié. Merci d'astuce.


JSR 303 possède également d'autres implémentations et certaines frameworks Web Java peuvent s'intégrer à JSR 303 pour permettre la validation du client et du côté serveur à partir des annotations. J'ai utilisé un module pour Apache Wicket. Le printemps et le printemps mvc le soutiennent aussi.


Dupliquée par Stackoverflow.com/Questtions/28067074/... < / a>


3 Réponses :


2
votes

java.lang.reflect.AnnotateLementElement.Gethannotations () API indique qu'il renvoie toutes les annotations présentes sur cet élément. Il ne dit rien sur l'ordre dans lequel ces annotations sont retournées


1 commentaires

Checkout Cette réponse: Stackoverflow.com/a/30222541/810109 - En ce qui concerne les annotations sont extraites dans un Garanti ordre.



-5
votes

en Java 7 et plus bas, vous ne pouvez pas avoir plusieurs annotations du même type sur un élément. Vous pouvez leur faire partie de la valeur d'une autre annotation:

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


1 commentaires

Cela n'a pas répondu à la question de savoir si des questions de commande ou non. Si vous avez Méthode de vide public (@foo @bar String Str) , il serait agréable de supposer que si je le fais pour traiter la barre de traitement de tous les critères de FOO.



6
votes

dépend de ce que vous entendez par "persistant". Je pense que vous pourriez avoir eu quelque chose impliqué dans la question, alors voici quelques questions-réponses suivantes:

est l'ordre d'annotation persistant? Strong>

Oui, il est écrit dans le fichier .Class code> dans une commande qui ne change pas. P>

est-ce que les annotations doivent commander dans le .class code> Le fichier reflète l'ordre des annotations dans le code source? strong>

Oui. Si vous compilez votre code ... p> xxx pré>

et vérifier avec javap -v code>: p> xxx pré> Si vous modifiez l'ordre des annotations, la commande dans le code d'octet changera également. Testé avec OpenJDK 1.8.0_121, mais je pense que c'est le cas pour les JDK plus tôt. P>

est l'ordre du bytecode conservé par la méthode GetanNotations () CODE>?
Oui, à partir de ce que je peux voir, il retourne systématiquement le même ordre que dans le code octet dans le fichier .class code>. P>

est Getannotations ( ) code> garanti de refléter l'ordre des annotations de bytecode à l'avenir? strong>

Non, tel que répondu par l'autre réponse, ce comportement n'est pas documenté, alors ne peut donc pas être invoqué dans une bibliothèque disponible publiquement.
Cependant, il y a signes subtils que la commande doit être conservée en quelque sorte. p>

maintenant à votre but, Si c'était garanti, devrais-je utiliser la commande pour que certaines annotations s'appliquent à certaines annotations précédentes? strong>

C'est une question de goût, mais je dirais que la plupart des programmeurs Java ne voudraient pas aimer cela. Ce ne serait pas un code très intuitif et lisible. Je suggérerais de regrouper les annotations telles que P>

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


2 commentaires

Une partie de votre exemple n'a pas l'air possible: validators = {@notnull, @noPty} est-ce une surveillance ou pouvez-vous fournir une définition du membre validateurs () membre Cela permet ce type d'utilisation?


@Glennlane, tu as raison. Je vais corriger avec un meilleur exemple.