Используя мультиметоды мы можем добавить методы к существующим классам Java. Мой вопрос состоит в том, возможно ли переопределить один определенный метод, и как, от Clojure кодируют. Например, если у Вас есть следующий класс,
public class Shape {
public void draw() {
...
}
}
Я хотел бы смочь выполнить что-то для добавления перед методом, таким как это:
(attach-to-method Shape/draw :before
(println "... about to draw a shape"))
И после оценки той формы, все последующие вызовы для рисования начали бы печатать строку прежде, чем выполнить сам вызов.
Моя цель с этим вложением приблизительно, подобное AOP поведение, состоит в том, что платформа, называя тот метод на существующем экземпляре может быть динамично изменена и начать выполнять недавно присоединенный код. В настоящее время я использую AspectJ для этого, но я добираюсь до точки, где использование другого компилятора не является опцией, и мне любопытно знать, могу ли я просто канава AspectJ.
Короткий ответ: Нет.
Как и в Java, единственный способ изменить класс - это расширить (подкласс) его. Вы можете расширить Shape
и переопределить метод draw
(при условии, что draw
не объявлен final
). В Clojure это можно сделать с помощью proxy
или gen-class
.
Если вы не можете сделать это на Java, вы не сможете сделать это в Clojure.