Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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
Java 为什么(int)MethodHandle.invokeExact缺少checkcast指令?_Java_Casting_Jvm_Bytecode_Methodhandle - Fatal编程技术网

Java 为什么(int)MethodHandle.invokeExact缺少checkcast指令?

Java 为什么(int)MethodHandle.invokeExact缺少checkcast指令?,java,casting,jvm,bytecode,methodhandle,Java,Casting,Jvm,Bytecode,Methodhandle,我为try JavaMethodHandle-API创建了两个简单类: public class Foo { private static int staticField; public static Object getStaticField() { return staticField; } } .... public static void methodHandleGetStaticField() throws Throwable { M

我为try Java
MethodHandle
-API创建了两个简单类:

public class Foo {
    private static int staticField;

    public static Object getStaticField() {
        return staticField;
    }
}
....
public static void methodHandleGetStaticField() throws Throwable {
    MethodHandle methodHandle = lookup.findStatic(Foo.class, "getStaticField", MethodType.methodType(int.class));
    int i = (int)methodHandle.invokeExact();
}

public static void directGetStaticField() {
    int i = (int)Foo.getStaticField();
}
....
调用方法
Foo.getStaticField()
的另一个类有两种方式-直接调用和使用
MethodHandle
-API:

public class Foo {
    private static int staticField;

    public static Object getStaticField() {
        return staticField;
    }
}
....
public static void methodHandleGetStaticField() throws Throwable {
    MethodHandle methodHandle = lookup.findStatic(Foo.class, "getStaticField", MethodType.methodType(int.class));
    int i = (int)methodHandle.invokeExact();
}

public static void directGetStaticField() {
    int i = (int)Foo.getStaticField();
}
....
我对类进行了反编译,发现
directGetStaticField
方法包含cast指令,但
methodHandleGetStaticField
方法不包含cast指令,尽管
java.lang.invoke.MethodHandle.invokeExact()
返回
java.lang.Object

public static void directGetStaticField();
descriptor: ()V
Code:
   0: invokestatic  #70    // Method ru/fj/methodhandle/Foo.getStaticField:()Ljava/lang/Object;
   3: checkcast     #33    // class java/lang/Integer
   6: invokevirtual #74    // Method java/lang/Integer.intValue:()I
   9: istore_0
  10: return

public static void methodHandleGetStaticField() throws java.lang.Throwable;
descriptor: ()V
Code:
   0: getstatic     #15    // Field lookup:Ljava/lang/invoke/MethodHandles$Lookup;
   3: ldc           #29    // class ru/fj/methodhandle/Foo
   5: ldc           #90    // String getStaticField
   7: getstatic     #32    // Field java/lang/Integer.TYPE:Ljava/lang/Class;
  10: invokestatic  #38    // Method java/lang/invoke/MethodType.methodType:(Ljava/lang/Class;)Ljava/lang/invoke/MethodType;
  13: invokevirtual #46    // Method java/lang/invoke/MethodHandles$Lookup.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
  16: astore_0
  17: aload_0
  18: invokevirtual #52    // Method java/lang/invoke/MethodHandle.invokeExact:()I
  21: istore_1
  22: return

有人能给我解释一下吗?

您可以注意到
invokeExact
确实从其描述符
()I
返回
int

因此,无需浇铸

它返回的是
int
,而不是
对象
,原因是
MethodHandle
中的方法
invokeExact
(以及
invoke
)是经过特殊处理的,请参见

返回

签名多态结果,使用对象静态表示

从以下方面:

。。。不同寻常的是,符号类型描述符是从实际参数和返回类型派生的,而不是从方法声明派生的