【发布时间】:2018-03-21 23:20:06
【问题描述】:
我确实需要用受保护的构造函数代理一个类的私有内部 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"。
有什么咒语可以解决这个问题吗?我很乐意使用任何必要的肮脏手段。
【问题讨论】:
-
非常有趣的问题。我以为我是新的答案,但事实证明这是一个与我预期不同的解决方案。 :)
-
您能详细说明为什么需要这样做吗?私有接口是封闭类的实现细节,所以我认为您不能使用代理以任何方式与现有代码进行交互。
-
当然,我有一个应用程序必须覆盖 java.net.InetAddress 的名称解析逻辑。在 JDK8 上,我可以代理 sun.net.spi.nameservice.NameService 并使用反射将 InetAddress.nameServices 设置为我自己的 NameService 实现。我正在将此应用程序更新到 JDK10,他们使 NameService 接口成为 java.net.InetAddress 的私有内部接口。 (我意识到他们也提供了 hosts 文件选项,但我需要的名称解析逻辑无法在 hosts 文件中表达)。
标签: java clojure clojure-java-interop