Comment faire des annotations comme @Override de travail en interne en Java?
Quelqu'un peut-il m'expliquer comment les annotations de travail en interne en java?
Je sais comment on peut créer des annotations à l'aide de java.lang.annotation de bibliothèque en java. Mais je ne comprends toujours pas comment ça fonctionne en interne, par exemple, l' @Override annotation.
Je serai vraiment reconnaissant si quelqu'un pouvait expliquer cela en détail.
- Qu'entendez-vous par "travail interne"? Le compilateur? Le moteur d'exécution?
- En interne, la façon dont c'est automatique identifié que cette méthode est de remplacer la méthode ou celui-ci n'est pas de remplacer la méthode. C'est le travail sur les deux temps. comme override annotation de travail au moment de la compilation et de printemps contrôleur d'annotation est une œuvre d'exécution
Vous devez vous connecter pour publier un commentaire.
La principale distinction entre les types d'annotations est de savoir si ils sont utilisés au moment de la compilation, puis rejeté (comme
@Override
) ou placé dans la classe compilée fichier et disponible au moment de l'exécution (comme le Printemps de l'@Component
). Ceci est déterminé par le @Retention de la politique de l'annotation. Si vous écrivez vos propres annotations, vous aurez besoin de décider si l'annotation est utile lors de l'exécution (pour l'autoconfiguration, peut-être) ou seulement au moment de la compilation (pour la vérification ou la génération de code).Lors de la compilation de code avec des annotations, le compilateur voit l'annotation tout comme elle voit d'autres modificateurs sur la source des éléments, comme des modificateurs d'accès (
public
/private
) oufinal
. Lorsqu'il rencontre une annotation, il exécute un processeur d'annotation, qui est comme une classe de plug-in qui dit qu'il est intéressé à une annotation spécifique. Le processeur d'annotation, on utilise généralement l'API Reflection pour inspecter les éléments en cours de compilation et peut simplement exécuter des vérifications, les modifier ou en créer de nouveaux du code compilé.@Override
est un exemple de la première; il utilise l'API Reflection pour vous assurer qu'il peut trouver une correspondance pour la signature de la méthode dans l'un des super-classes et utilise leMessager
pour provoquer une erreur de compilation si elle ne peut pas.Il y a un certain nombre de tutoriels disponibles sur l'écriture de l'annotation processors; voici un utile. Regardez à travers les méthodes sur le
Processeur
de l'interface pour la façon dont le compilateur appelle un processeur d'annotation; la principale opération a lieu dans leprocess
méthode, qui est appelée à chaque fois que le compilateur voit un élément qui a une correspondance annotation.En plus de ce que d'autres ont suggéré, je vous recommande de rédiger une mesure d'annotation et de son processeur à partir de zéro pour voir comment l'annotation des œuvres.
Dans le mien, par exemple, j'ai écrit une annotation pour vérifier si les méthodes sont surchargées au moment de la compilation.
Tout d'abord, créez une annotation nommé
Overload
. Cette annotation est appliqué à la méthode donc je l'annoter avec@Target(value=ElementType.METHOD)
Ensuite, créez processeur correspondant à manipuler les éléments annotés par annotation définie. Pour la méthode annotée par
@Overload
, sa signature doit apparaître plus d'une fois. Ou l'erreur est imprimé.Après l'emballage, d'annotation et de ses processus dans un fichier jar, créer une classe avec
@Overload
et l'utilisation javac.exe pour le compiler.Depuis
nonOverloadedMethod()
n'a pas été surchargé, nous allons obtenir le résultat comme ci-dessous:OverloadProcessor::process
pourquoi il estentry.getValue() == 1
? L'un n'avez pas à ajouter une annotation à la classe parent/interface, de sorte queroundEnv.getElementsAnnotatedWith(Overload.class)
de ne pas obtenir de la classe parent/interface, droit?Voici
@Override
: http://www.docjar.com/html/api/java/lang/Override.java.html.Il n'y a rien de spécial qui la différencie d'une annotation, vous pouvez écrire vous-même. Bits intéressants sont dans la consommateurs des annotations. Pour une annotation comme
@Override
, qui serait dans le compilateur de Java lui-même, ou "statique" un outil d'analyse de code, ou de l'IDE.@Override
(ou d'autres annotations standard).Fondamentalement, les annotations sont juste des marqueurs qui sont lus par le compilateur ou de l'application.
En fonction de leur stratégie de rétention, ils sont disponibles au moment de la compilation uniquement ou sont lisibles au moment de l'exécution à l'aide de la réflexion.
De nombreux cadres de l'utilisation d'exécution de rétention, c'est à dire qu'ils reflectively vérifier si certaines d'entre elles sont présentes sur une classe, une méthode, terrain etc. et de faire quelque chose si l'annotation est présente (ou pas). En outre, les membres des annotations peuvent être utilisés pour transmettre de plus amples informations.
Suivre cette lien. Cela permettra d'assurer une réponse à votre problème. Si nous nous sommes concentrés sur les annotations dans
Java
, les Annotations ont été introduites dans Java 5 et ne relèvent pas du Ressort spécifique. En général, les annotations permettent d'ajouter des métadonnées à une classe, une méthode ou une variable. Une annotation peut être interprété par le compilateur (par exemple, l' @Override annotation) ou par un framework comme spring (par exemple, l' @Composante de l'annotation).En outre, je suis en ajoutant plus de références.