我正在尝试在Android上使用MethodHandle
作为项目。目前,我正在将一些现有的Java代码转换为与Android兼容,但我遇到了问题。
在普通的Java 7/8中,以下编译和打印" Jim":
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
public class Example {
public static void main(String[] args) throws Throwable {
MethodHandle arrayReader = MethodHandles.arrayElementGetter(String[].class);
Object array = new String[]{"Hi", "there", "Jim"};
Object item = arrayReader.invoke(array, 2);
System.out.println(item);
}
}
相同的代码为Android编译,但在运行时抛出异常:
java.lang.NoSuchMethodError: No virtual method invoke(Ljava/lang/Object;I)Ljava/lang/Object; in class Ljava/lang/invoke/MethodHandle; or its super classes (declaration of 'java.lang.invoke.MethodHandle' appears in /system/framework/core-oj.jar)
MethodHandle.invoke存在并使用varargs功能传递任意数量的Object
个参数,但在运行时它会尝试使用参数类型为Object
和{{1的arity 2查找方法}}
我尝试使用数组参数int
替换invoke
调用,但这只会产生另一个问题:
arrayReader.invoke(new Object[]{array, 2})
我无法预料到这会起作用,因为java.lang.UnsupportedOperationException: MethodHandle.invoke cannot be invoked reflectively.
调用产生的MethodHandle
需要两个参数(数组和索引),但我认为值得镜头。
我正在运行API级别为26的Android模拟器。这是MethodHandles.arrayElementGetter
文件的一部分:
build.gradle
有没有办法解决这个问题,或者另一种方法可以达到相同的效果?
答案 0 :(得分:0)
我解决了自己的问题:
我将Android studio升级到版本3,并升级了所有必需的插件版本,例如构建工具,Gradle到版本4,这解决了问题。阅读这篇文章促使我升级:pnfsoftware.com/blog / ...(虽然没有特别提及将Android Studio升级到此版本)。