[讨论] 求一些MethodHandle使用的例子

hellhell 2011-09-21
最简单的invokeexact的例子比较明白了,但是希望还可以找到更多的例子,比如invokegeneric的,最好是完整的小程序。我想oracle应该官方应该有这些的,但是不知道怎么找到。
RednaxelaFX 2011-09-21
invokeGeneric已经改名为invoke了。不知道你用的是什么版本呢?

如果你对整个JSR 292的用法感兴趣,那请参考JSR 292 Cookbook,是非常好的学习资源。单纯的MethodHandle其实并没有多少特别的地方…
hellhell 2011-09-21
谢谢R大提供资源,另外R大可以帮忙看看这个小例子么?我在7b127上一直通不过,报错
Exception in thread "main" java.lang.invoke.WrongMethodTypeException: (Ljava/lang/String;Z)Ljava/lang/String; cannot be called without a receiver argument as (Ljava/lang/String;Z)Ljava/lang/String;
at Main.findSpecial_tests(Main.java:26)
at Main.main(Main.java:11)
谢谢了,我想了很久,findSpecial怎么使用,好像一直没有想明白,MethodHandle也没有api可以插入receiver的ref。
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class Main {
        public static void main(String[] args) throws Throwable {
                System.out.println("MethodHandle tests begin ...");

                //findSpecial tests
                Main obj = new Main();
                obj.findSpecial_tests();
        }

        public class ExtendsMain extends Main {

        }

        public String testMethodFindSpecial(String s, boolean b){
                String a = s+Boolean.toString(b);
                return a;
        }


        public void findSpecial_tests() throws Throwable {
                MethodHandle mh = MethodHandles.lookup().findSpecial(Main.class, "testMethodFindSpecial", MethodType.methodType(String.class, String.class, boolean.class), Main.class);
                String a = (String)mh.invokeExact("abc", true);
        }
}

RednaxelaFX 2011-09-21
不要用7b127了,里面好些API跟正式版都不一样。用7b147吧…

你的例子里ExtendsMain是用来干嘛的?我没看出它在哪里被使用过。

findSpecial得到的MethodHandle是用来模拟invokespecial的。所有针对invokespecial的限制在这些MethodHandle上也一样起作用(例如说不能对任意的虚方法做invokespecial调用)。

receiver是放在MethodHandle.invokeExact()的第一个位置上的。没啥特别。
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

public class Main {
  public static void main(String[] args) throws Throwable {
    System.out.println("MethodHandle tests begin ...");

    //findSpecial tests
    Main obj = new Main();
    obj.findSpecial_tests();
  }

  public String testMethodFindSpecial(String s, boolean b) {
    String a = s + b;
    return a;
  }

  public void findSpecial_tests() throws Throwable {
    MethodHandle mh = MethodHandles.lookup()
      .findSpecial(
        Main.class,
        "testMethodFindSpecial",
        MethodType.methodType(String.class, String.class, boolean.class),
        Main.class);
    String a = (String) mh.invokeExact(this, "abc", true);
  }
}
hellhell 2011-09-21
测试通过了,谢谢R大的指点
Global site tag (gtag.js) - Google Analytics