【问题标题】:Is it possible to redefine Java methods from Clojure?是否可以从 Clojure 重新定义 Java 方法?
【发布时间】:2010-08-09 03:00:10
【问题描述】:

使用多方法,我们可以将方法添加到现有的 Java 类中。我的问题是是否可以从 Clojure 代码重新定义一种特定的方法,以及如何重新定义。例如,如果您有以下课程,

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

我希望能够运行一些东西来添加一个 before 方法,例如:

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

在评估该表单之后,所有后续的 draw 调用都会在执行调用之前开始打印一个字符串。

我对之前/之后/周围的这种附加,类似 AOP 的行为的目的是,在现有实例上调用该方法的框架可以动态更改并开始运行新附加的代码。目前我正在为此使用 AspectJ,但我已经到了无法选择使用不同编译器的地步,我很想知道我是否可以放弃 AspectJ。

【问题讨论】:

    标签: clojure aop


    【解决方案1】:

    简短回答:不。

    在 Java 中,修改类的唯一方法是扩展(子类)它。您可以扩展Shape 并覆盖draw 方法(假设draw 未声明final)。在 Clojure 中,这可以通过 proxygen-class 来完成。

    【讨论】:

    • 好的,谢谢。我知道proxygen-class,我只是想确保方法重定义在 Clojure 上仍然不可用 - 我希望一些我不知道的模糊 JVM 最近的变化可以启用它,但我想我'那么,我必须坚持使用 AspectJ。谢谢,斯图尔特和布赖恩!
    【解决方案2】:

    如果在 Java 中做不到,那么在 Clojure 中也做不到。

    【讨论】:

    • 这不是更像“如果你在JVM中做不到,你就不能在Clojure中做”?因此是的,我想我可以将我的问题重新表述为“在 JVM 中是否可能”,而不是在 Clojure 中。我只是过滤了语言,因为我想知道是否已经在 Clojure 上专门解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多