Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于IllegaccessException,Clojure无法在java 11上调用接口默认方法_Java_Clojure_Java 11 - Fatal编程技术网

由于IllegaccessException,Clojure无法在java 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

我已经将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.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模块的一部分,了解接口的类型会有所帮助;另请查看此页面以了解一些提示: