9 votes

Est-il possible de redéfinir des méthodes Java à partir de Clojure ?

Grâce aux multiméthodes, nous pouvons ajouter des méthodes aux classes Java existantes. Ma question est de savoir s'il est possible de redéfinir une méthode spécifique, et comment, à partir du code Clojure. Par exemple, si vous avez la classe suivante,

public class Shape {
    public void draw() {
        ...
    }
}

J'aimerais pouvoir exécuter quelque chose pour ajouter une méthode avant, comme ceci :

(attach-to-method Shape/draw :before
    (println "... about to draw a shape"))

Et après avoir évalué ce formulaire, tous les appels ultérieurs à draw commenceraient à imprimer une chaîne avant d'effectuer l'appel lui-même.

L'objectif de cet attachement avant/après/autour, un comportement de type AOP, est qu'un cadre appelant cette méthode sur une instance existante puisse être dynamiquement modifié et commencer à exécuter le code nouvellement attaché. J'utilise actuellement AspectJ pour cela, mais j'arrive à un point où l'utilisation d'un compilateur différent n'est pas une option, et je suis curieux de savoir si je peux simplement abandonner AspectJ.

11voto

Stuart Sierra Points 5671

Réponse courte : Non.

Comme en Java, la seule façon de modifier une classe est de l'étendre (la sous-classer). Vous pouvez étendre Shape et remplacer le draw (en supposant que draw n'est pas déclaré final ). En Clojure, ceci peut être accompli avec proxy o gen-class .

3voto

Brian Points 1648

Si vous ne pouvez pas le faire en Java, vous ne pouvez pas le faire en Clojure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X