Java 为什么(int)MethodHandle.invokeExact缺少checkcast指令?
我为try JavaJava 为什么(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
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
)是经过特殊处理的,请参见
返回:
签名多态结果,使用对象静态表示
从以下方面:
。。。不同寻常的是,符号类型描述符是从实际参数和返回类型派生的,而不是从方法声明派生的