简体   繁体   English

为什么(int)MethodHandle.invokeExact缺少checkcast-instruction?

[英]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.

相关问题 如何使用Object []数组调用MethodHandle.invokeExact()? - How to call MethodHandle.invokeExact() with an array of Object[]? Gradle Android Error:MethodHandle.invoke和MethodHandle.invokeExact - Gradle Android Error: MethodHandle.invoke and MethodHandle.invokeExact 尝试在 Android 中运行 Spark:仅从 Android O 开始支持 MethodHandle.invoke 和 MethodHandle.invokeExact - Trying to run Spark in Android: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O 错误:MethodHandle.invoke 和 MethodHandle.invokeExact 仅从 Android O (--min-api 26) 开始支持 - Erro: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26) MethodHandle.invoke 和 MethodHandle.invokeExact 仅从 Android O (--min-api 26) 开始支持 - MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26) MethodHandle InvokeExact参数 - MethodHandle InvokeExact parameter Android 构建 APK 时出现工作室“MethodHandle.invoke 和 MethodHandle.invokeExact 仅支持从 Android O (--min-api 26) 开始”错误 - Android studio "MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)" error when building APK 为什么即使 MethodHandle 没问题,在 invokeExact 上也会得到 WrongMethodTypeException - Why do I get a WrongMethodTypeException on invokeExact even though MethodHandle is OK 对checkcast字节码指令的困惑? - Confusion on the checkcast bytecode instruction? MethodHandle示例在invokeExact调用时抛出WrongMethodTypeException - MethodHandle example throws WrongMethodTypeException on invokeExact call
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM