使用multimethods,我们可以向现有的Java类添加方法。我的问题是,是否有可能重新定义一种特定方法,以及如何从Clojure代码中重新定义。例如,如果您有以下类,
public class Shape {
public void draw() {
...
}
}
我希望能够运行一些东西来添加一个before方法,例如:
(attach-to-method Shape/draw :before
(println "... about to draw a shape"))
在评估该表单后,所有后续的绘制调用都将在执行调用之前开始打印字符串。
我对这种类似AOP的行为之前/之后的附件的目的是,可以动态地更改在现有实例上调用该方法的框架并开始运行新附加的代码。目前我正在使用AspectJ,但我已经到了使用不同编译器不是一个选项的地步,我很想知道我是否可以放弃AspectJ。
答案 0 :(得分:8)
简短回答:不。
与Java一样,修改类的唯一方法是扩展(子类)它。您可以扩展Shape
并覆盖draw
方法(假设draw
未声明为final
)。在Clojure中,可以使用proxy
或gen-class
来完成此操作。
答案 1 :(得分:3)
如果你不能用Java做,那就不能在Clojure中做到。