[讨论] 求一些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大的指点
|