代理私有接口

时间:2018-03-21 23:20:07

标签: java clojure clojure-java-interop

我确实需要使用受保护的构造函数代理类的私有内部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"

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

1 个答案:

答案 0 :(得分:0)

答案是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()构造函数,我也无法重现您的错误。