Можно ли переопределить методы Java из Clojure? - PullRequest
6 голосов
/ 08 августа 2010

Используя мультиметоды, мы можем добавлять методы в существующие классы Java. Мой вопрос заключается в том, можно ли переопределить один конкретный метод и каким образом из кода Clojure. Например, если у вас есть следующий класс,

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

Я бы хотел иметь возможность запустить что-то для добавления метода before, например:

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

И после оценки этой формы все последующие вызовы для рисования начнут печатать строку перед выполнением самого вызова.

Моя цель с этим присоединением AOP-подобного поведения до / после / вокруг состоит в том, что инфраструктура, вызывающая этот метод в существующем экземпляре, может динамически изменяться и запускать вновь присоединенный код. В настоящее время я использую AspectJ для этого, но я дошел до того, что использование другого компилятора не вариант, и мне любопытно узнать, могу ли я просто отказаться от AspectJ.

Ответы [ 2 ]

8 голосов
/ 08 августа 2010

Краткий ответ: Нет.

Как и в Java, единственный способ изменить класс - это расширить его (подкласс).Вы можете расширить Shape и переопределить метод draw (при условии, что draw не объявлено final).В Clojure это можно сделать с помощью proxy или gen-class.

3 голосов
/ 08 августа 2010

Если вы не можете сделать это в Java, вы не можете сделать это в Clojure.

...