我确实需要使用受保护的构造函数代理类的私有内部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"
。
是否有一些可以解决这个问题的咒语?我很乐意使用任何必要的肮脏技巧。
答案 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()
构造函数,我也无法重现您的错误。