Mig*_*boa 5 java jvm invokedynamic java-7 methodhandle
MethodHandle类的描述中显示的示例在使用以下描述WrongMethodTypeException的语句调用中抛出a mh.invokeExact("daddy",'d','n'): (CC)Ljava/lang/String; cannot be called with a different arity as ([Ljava/lang/Object;)Ljava/lang/Object;.
该MethodHandle对象mh具有对应于的符号类型描述符:(CC)Ljava/lang/String.但是当我们调用时mh.invokeExact("daddy",'d','n'),参数:d并n作为Object数组传递,然后它们与该类型的参数不匹配char.
我知道我可以使用invokeWithArguments而不是invokeExcat或者解决上述问题invoke,但是这个例子应该像MethodHandleJava 7 API 的描述中所说的那样工作.除此之外,它invokeWithArguments具有与invoke/ 相关的性能开销invokeExact.
你如何编译这个?
对我来说,这听起来很像一个已知的 Eclipse bug。
我刚刚检查了 javac 和这段代码:
import java.lang.invoke.*;
public class ScratchMH {
private static ScratchMH instance = null;
public ScratchMH() {
super();
}
private void run() throws Throwable {
Object x, y; String s; int i;
MethodType mt; MethodHandle mh;
MethodHandles.Lookup lookup = MethodHandles.lookup();
// mt is (char,char)String
mt = MethodType.methodType(String.class, char.class, char.class);
mh = lookup.findVirtual(String.class, "replace", mt);
s = (String) mh.invokeExact("daddy",'d','n');
// invokeExact(Ljava/lang/String;CC)Ljava/lang/String;
System.out.println(s);
}
public static void main(String[] args) throws Throwable {
instance = new ScratchMH();
instance.run();
}
}
Run Code Online (Sandbox Code Playgroud)
似乎工作正常:
ariel-2:src boxcat$ javac scratch/clj/ScratchMH.java
ariel-2:src boxcat$ java scratch/clj/ScratchMH
nanny
ariel-2:src boxcat$
Run Code Online (Sandbox Code Playgroud)
javap 输出的相关部分似乎也很正常:
35: invokevirtual #8 // Method java/lang/invoke/MethodHandles$Lookup.findVirtual:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
38: astore 6
40: aload 6
42: ldc #9 // String daddy
44: bipush 100
46: bipush 110
48: invokevirtual #10 // Method java/lang/invoke/MethodHandle.invokeExact:(Ljava/lang/String;CC)Ljava/lang/String;
51: astore_3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1441 次 |
| 最近记录: |