[英]Why checkcast-instruction is absent for (int)MethodHandle.invokeExact?
I have created 2 simple classes for try Java MethodHandle
-API: 我为try Java MethodHandle
创建了2个简单的类:
public class Foo {
private static int staticField;
public static Object getStaticField() {
return staticField;
}
}
another class for invoke method Foo.getStaticField()
in two ways - direct and using MethodHandle
-API: 另一个用于调用方法Foo.getStaticField()
有两种方式 - 直接和使用MethodHandle
:
....
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();
}
....
I have decompiled class and saw that directGetStaticField
method contains cast instructiona, but method methodHandleGetStaticField
doesn't, though java.lang.invoke.MethodHandle.invokeExact()
returns java.lang.Object
. 我已经反编译了类,并看到directGetStaticField
方法包含directGetStaticField
指令,但方法methodHandleGetStaticField
没有,尽管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
Could anyone explain it for me? 有谁可以帮我解释一下?
You can notice that invokeExact
indeed returns an int
from its descriptor ()I
: 您可以注意到invokeExact
确实从其描述符()I
返回一个int
:
18: invokevirtual #52 // Method java/lang/invoke/MethodHandle.invokeExact:()I
As a result, no casting is required. 结果,不需要铸造。
The reason why it returns an int
, not an Object
, is that method invokeExact
(as well as invoke
) in MethodHandle
are treated specially, see the invokeExact API 为什么它返回一个原因int
,而不是一个Object
,是方法invokeExact
(以及invoke
的) MethodHandle
经特殊处理,请参阅invokeExact API
Returns : 退货 :
the signature-polymorphic result, statically represented using Object 签名 - 多态结果,使用Object静态表示
and from the signature polymorphism : 并从签名多态性 :
... The unusual part is that the symbolic type descriptor is derived from the actual argument and return types, not from the method declaration. ...不寻常的部分是符号类型描述符是从实际的参数和返回类型派生的,而不是从方法声明派生的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.