6

我有一个 java 类,它有 2 个方法具有相同但不同的参数(一个不带参数,另一个带 1 个参数)。我创建了一个覆盖这两种方法的代理。问题是,如果从这个 java 类调用无参数方法 - 调用基本实现而不是代理。但是,如果我直接在 obj 上调用无参数方法 - 将调用正确的代理方法。有人可以解释这种行为吗?

测试.java:

package example;

public abstract class Test {

    public void callMethods(Object obj){
        callMethods();
        callMethods2();
    }

    public void callMethods() {
        System.out.println("Default callMethods");
    }

    public void callMethods2() {
        System.out.println("Default callMethods2");
    }

}

运行.clj:

(let [obj (proxy [example.Test] []
            (callMethods
              ([] (println "Overridden callMethods"))
              ([obj] (proxy-super callMethods obj)))
            (callMethods2
              ([] (println "Overridden callMethods2"))))]
  (.callMethods obj)
  (.callMethods obj :test))

输出:

Overridden callMethods
Default callMethods
Overridden callMethods2

预期输出:

Overridden callMethods
Overridden callMethods
Overridden callMethods2
4

1 回答 1

5

Proxy 维护一个它为这个对象代理的方法的映射。它使用它的方法处理此映射中的任何调用,其他调用则调用该对象。proxy-super通过从函数方法映射中移除自身、调用自身并将自身放回后缀,这是否很神奇。在调用期间,对代理对象的该方法的任何调用都将落入代理对象。

  • 第一行输出来自代理调用,您会看到被覆盖的输出
  • 第二行来自带有零参数的超级方法,因为当调用发生时,覆盖方法不在对象代理方法映射中。
  • 第三行被代理,因为该方法在对象代理方法映射中。

Meikel Brandmeyer 在这篇文章的末尾描述了一个非常相似的场景。我怀疑答案是使用 gen-class 而不是代理

于 2012-10-30T09:39:14.747 回答