Técnica Avancée d’Apenrewrite: Utilizer les Mensagens Pote Impléenter des Logiques Complexos

Foto por Pixabay Je Vous Avais Déjà Parlé d’Apenrewrite Dans le Premier Artigo De Cette Série. Si Vous ne l’avez pas lu et que vais avez bordoin d’un petit rafraichisement, jevious convidado à mettre la lection de ce post em ⏸️ et à y revenir plus tard. Bon mais? Allez vai. Tous les Cas d’Usage não é uma pergunta été dans l’arty, précédent font intervennir une recette qui n’a b ?oin que des informações sobre problemas para un e seul niveau du lst. Puisqu’une Imagem Vaut Mieux Qu’un Long Discours, et que Je Je Sense Bien que Je me suis pas pts très bien fait Compreendre, Voici Un OrMple Crédible d’st: Jusqu’à present les exmeples Ophera DeS modifications Surs invasores de Métodos, parentes, ou menos, a exposição, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não é uma expectativa, que não se importa com os expostos. Dans le diagrama précédent, Chaque nœud corresponde à un élément d’Ast (les choses Sont évidemments simplifiées ici). Comme nous l’avons déjà vu, openrewrite Utilize o padrão visiteur servir parcourir l’Arbre. Além disso, o précisément les recebe as implicantes des visiturs não les interfaces correspondentes Au langage manipulé.en l’aturcence, les manipulações Sont Effectuees sur du java, et le visiteur utilizador sera donc un javaisovisitor. Oui, mais si é Mon Cas d’Usage nécessite d’d’diedifier une invocação de méthode pour agir sur la déclaration de la méthode qui la contient dans une classe? OUI, JE TE COMPRENDE, ET CETTE PERGUNTA M’A MOI Aussi Empecher de Dormir Pingente Quelques Jours. Seulement vois-tu, les gens derrières abrewrite aussi.ils nous donc mis à disposição un système de mensagem Très Convanncante et plutôt sûr. Cas d’Usage Imaginons que Quelqu’un de mal Avisé, Non, N’insistez pas, Je ne Vous Dirai Pas Qui. D’COCOOOOOORD C’EST MOI. Imaginons Donc, Disais-je, Quelqu’un de Mal Avisé Ait Développé Dans Une Librarie Un Moyen d’Enregister Le Traitement D’Enen Méthode: Importar com.github.jtama.toxic.timer.LogStart; importar estático com.github.jtama.toxic.timer.logend; importar com.github.jtama.acme.process.longRunningmethod; classe pública manualgearcar {@deprecated<4>
public void Drift (String param) {LogStart ();<1>
longRunningMethod (param);<2>
logon ();<3>
} } Enter fullscreen mode Exit fullscreen mode Enregistre le début d’exécution de la méthode Exécute un traitement Enregistre la fin d’exécution de la méthode Random annotation qui aura son intérêt plus tard Arpès d’intense recherche nous avons découvert l’existence de micrometer et de son annotation io.micrometer.core.annotation.timed. En Tant Que Dévelondpeur, Je Vaise Identificador L’Avocation de la Méthode Timer#LogStart () et Si Je la Trouve: La Supprimer SuppriMer L’Avocation de la Método Timer#LOGEND () SI ELLE existe ajouter l’notation @theted Surser# ALONS Mettre en œuvre Dans La Recette. Implémentação Dans Cet Exemple, Nous ne considerans que l’ippleimentation du visiteur, pas la recette complète. Mais comme d’abitude, tout estes desponável Dans le dépôt github a classe estática privada replacecomparevisitor {Private Final MethodMatcher LogStartInvocamatcher = new MethodMatcher (“com.github.jtama.toxic.timer logstart ()”);<1>
MethodMatcher Final MethodMatcher privado LOGENDINVOCAMACHER = new MethodMatcher (“com.github.jtama.toxic.timer legend ()”); ANOTATION FINAL ANNOTATION LOGSTARTMACHER = NOVA ANNOTATIONMACHER (“@io.micrometer.core.annotation.timed”); private final javatemplate anoTationTemplate = javatemplate.builder (“@timed”) .imports (“io.micrometer.core.annotation.timed”) .javaparsser (javaparssert.fromjavoversion () .cllassPathpath (JavaParser.RuntImecLatspathPathPathPathatsPathatsPathatsPathatsPathatsPathatsPathatsPathatspath (). public ReplacECompeareVisitor () {MayberoveImport (“com.github.jtama.toxic.timer”); } @Override Public J.MethodDeclaration VisitMethodDeclaration (J.MethodDeclaration Method, ExecutionContext CTX) {<3>
J.MethodDeclaration md = super.VisitMethodDeclaration (Método, CTX); Cursor cursor = getCursor (); if (cursor.getMessage (“Appendannotation”, false)) {if (md.getLeadingannoTations (). stream () .noneatch (LogStartMatcher :: Matches)) {Maybeaddimport (“io.micrometer.core.annotation.timed”); md = anoTationTemplate.Apply (cursor, Method.getCoordinates (). addannotation (comparador.comparing (j.annotation :: getSplename)); }} retornar md; } @Override Public J.Methodinvocation VisitMethodinVocation (Método J.Methodinvocation, ExecutionContext CTX) {<2>
J.MethodinVocation mi = super.VisitMethodinVocation (Method, CTX); if (logstartinvocamatcher.matches (mi) || legendInvocamatcher.matches (mi)) {getCursor (). retornar nulo; } retornar mi; }} Digite o modo de tela cheia de tela cheia de tela cheia les utilitaires le visiteur d’alvocation de méthode le visiteur de déclaration de méthode les utilitaires dans cette seção, deux outils d’elerewrite sont utilisés. LE MethodMatcher PERMETT D’Edrenifier Précisément les Invocações de Méthodes Ciblées, TELLES QUE LOGSTART () ET LOGEND (). L ‘AnoTationMatcher Sert à VérriFier la Présence de l’Anotation @timed sur une méthode. Enfin, le javatemplate facilite l’rensertion de l’onotation dans le Code Source et gère l’mport néCessaire. Ces utilitários simplificadores de manipulação de l’str et préparent les modificações à apliques Dans Les visiteurs. Le visiteur d’Avocation de Méthode (visitMethodinvocation) CE Visiteur Parcourt Chaque Appel de Méthode dans LE Código Fonte. Lorsqu’il rencontre une invocação de logstart () ou logend (), iloute un mensagem de mensagem servir sinalizador qu’une anotação devra être ajoutée ultrerieuncuring. Mensagem da ONU N’est en Réalité Qu’un Tuple, mais Interessante Interessante, C’est Que L’On On PÉCISE LE SCOPE d’AcessiBilité du Mensagem Pour éviter de polluer tout le contexte. Ocorrência, seul la méthode contenant l’vocation em pergunta pourra accés Au mensagem (putmessageonfirsteclosing (j.methoddeclaration.class …). DÉCLARAÇÃO DE MÉTODO (VisitMethodDeclaration) Celui-là est Vraimento mais simples Puisqu’une Image Vaut Mieux Qu’un Long Discours.

Fonte

Você pode ter perdido