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? P>
3 Réponses :
java.lang.reflect.AnnotateLementElement.Gethannotations () code>
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 p>
Checkout Cette réponse: Stackoverflow.com/a/30222541/810109 - En ce qui concerne les annotations sont extraites dans un Garanti b> ordre.
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; }
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) Code>, il serait agréable de supposer que si je le fais pour traiter la barre de traitement de tous les critères de FOO.
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> est-ce que les annotations doivent commander dans le et vérifier avec est l'ordre du bytecode conservé par la méthode est maintenant à votre but,
Si c'était garanti, devrais-je utiliser la commande pour que certaines annotations s'appliquent à certaines annotations précédentes? strong>
Oui, il est écrit dans le fichier .Class code> dans une commande qui ne change pas. P>
.class code> Le fichier reflète l'ordre des annotations dans le code source? strong>
Oui. Si vous compilez votre code ... p> javap -v code>: p>
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>
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
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();
Une partie de votre exemple n'a pas l'air possible: validators = {@notnull, @noPty} code> est-ce une surveillance ou pouvez-vous fournir une définition du membre
validateurs () code> membre Cela permet ce type d'utilisation?
@Glennlane, tu as raison. Je vais corriger avec un meilleur exemple.
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"); code>?
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>