由于IllegaccessException,Clojure无法在java 11上调用接口默认方法
我已经将Clojure应用程序从jdk8移动到jdk11(Zulu JRE 11),它开始无法在接口上调用,接口的实现是机器生成的(看起来像由于IllegaccessException,Clojure无法在java 11上调用接口默认方法,java,clojure,java-11,Java,Clojure,Java 11,我已经将Clojure应用程序从jdk8移动到jdk11(Zulu JRE 11),它开始无法在接口上调用,接口的实现是机器生成的(看起来像#object[com.sun.proxy.$Proxy110 0x28466aa5 nil]) 我知道 (.someDefaultMethod iinterface impl) 得到 java.lang.IllegalAccessException: access to public member failed: my.IInterface.so
#object[com.sun.proxy.$Proxy110 0x28466aa5 nil]
)
我知道
(.someDefaultMethod iinterface impl)
得到
java.lang.IllegalAccessException: access to public member failed:
my.IInterface.someDefaultMethod[Ljava.lang.Object;@172aedbe/invokeSpecial, from my.IInterface/2 (unnamed module @627551fb)
at java.base/java.lang.invoke.MemberName.makeAccessException(MemberName.java:942)
at java.base/java.lang.invoke.MethodHandles$Lookup.checkAccess(MethodHandles.java:2206)
at java.base/java.lang.invoke.MethodHandles$Lookup.checkMethod(MethodHandles.java:2146)
at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:2290)
at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodNoSecurityManager(MethodHandles.java:2283)
at java.base/java.lang.invoke.MethodHandles$Lookup.unreflectSpecial(MethodHandles.java:1798)
at my.SomeService.invoke(SomeService.java:305)
有什么解决办法吗?谢谢大家! 结果表明,该错误不是由于Clojure,而是由于在代理处理程序的
调用中调用默认方法的编码方式造成的:
@覆盖
公共对象调用(对象代理、方法、对象[]args)抛出Throwable{
System.out.println(“代理:调用”+方法);
//默认方法是公共的非抽象实例方法
//在接口中声明。
if(((method.getModifiers()&(Modifier.ABSTRACT | Modifier.PUBLIC | Modifier.STATIC))==
Modifier.PUBLIC)和&method.getDeclaringClass().isInterface(){
//看https://rmannibucau.wordpress.com/2014/03/27/java-8-default-interface-methods-and-jdk-dynamic-proxies/
最终构造函数=MethodHandles.Lookup.class.getDeclaredConstructor(class.class,int.class);
如果(!constructor.isAccessible()){
constructor.setAccessible(true);
}
最终类declaringClass=方法.getDeclaringClass();
返回构造函数.newInstance(declaringClass,MethodHandles.Lookup.PRIVATE)
.无反射特殊(方法,去极化等级)
.bindTo(代理)
.调用参数(args);
}
返回null;
}
根据接口的不同,它可能是默认情况下不可用的Java模块的一部分,了解接口的类型会有所帮助;另请查看此页面以了解一些提示: