代理专用接口



我真的需要用受保护的构造函数代理一个类的私有内部 java 接口。

我坚持使用现有的编译 java 代码:

public class Foo {
  Foo() {}
  private interface Bar {
    void someMethod();
  }
}

并尝试编写此 clojure 代码:

(proxy [Foo$Bar] []
  (someMethod []
     ...))

但是编译这个会抛出java.lang.IllegalAccessError "proxy... cannot access its superinterface Foo$Bar".

有没有一些咒语可以解决这个问题? 我很乐意使用任何必要的肮脏技巧。

答案是extend原始类,并复制接口,同时将其标记为public访问:

package demo;
public class Calc {
  Calc() {
    System.out.println(  "Calc() constructor");
  }
  private interface Adder {
    String doSomething();
  }
}

对于新的子类:

package demo;
public class CalcChild extends Calc {
  public CalcChild() {
    super();
    System.out.println("CalcChild(): super() - return ");
  }
  public interface Adder {
    String doSomething();
  }
  public void doBoo() {
    System.out.println("Boo!");
  }
}

proxy代码:

 (let [adder      (proxy [demo.CalcChild$Adder] []
                    (doSomething [] "something"))
       calcChild  (demo.CalcChild.)]
   (.doSomething adder)
   (.doBoo calcChild))

结果:

Calc() constructor
CalcChild(): super() - return 
(.doSomething adder) => "something"
Boo!

更新:

我更新了答案,但仍然有些不对劲。 即使我注释掉了新的CalcChild()构造函数,我也无法重现您的错误。

最新更新