4

Java 7 で MethodHandles を試しています。

ここにクラスがあります:

public class TestCase {
    MethodType mt;

    public static void main(String args[])
    {
        Android a = new Android();
        MethodHandleExample.doSomething(a);
    }
}

class Android {
    public void thisIsMagic()
    {
        System.out.println("Might be called from the method handel");
    }
}

メソッド ハンドルのサンプル呼び出しは、このクラスにあります。

public class MethodHandleExample {

    public static void doSomething(Object obj)
    {
        MethodHandle methodHandle = null ;
        MethodType mt = MethodType.methodType(void.class);
        MethodHandles.Lookup lookup = MethodHandles.lookup();

        try{
            try {
                methodHandle = lookup.findVirtual(obj.getClass(),"thisIsMagic",mt);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (IllegalAccessException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
        finally {

        }
        try {
            methodHandle.invoke();
        } catch (Throwable throwable) {
            throwable.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}

しかし、このコードを実行しようとすると、次のような例外が発生します。

java.lang.invoke.WrongMethodTypeException: cannot convert MethodHandle(Android)void to ()void
    at java.lang.invoke.MethodHandle.asType(MethodHandle.java:691)
    at java.lang.invoke.InvokeGeneric.dispatch(InvokeGeneric.java:103)
    at com.generic.exception.AnnotationParser.doSomething(AnnotationParser.java:35)
    at com.generic.exception.TestCase.main(TestCase.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

私が得ている例外は次の行にあります:

 methodHandle.invoke();

この場合、基になるメソッドを呼び出す方法がわかりません。

4

2 に答える 2

6

追加:

methodHandle.invoke(obj)

メソッドを実行するオブジェクトを指定する必要があります。

于 2013-02-10T09:07:16.473 に答える
1

オブジェクトのメソッド ハンドルを呼び出す必要があります。

methodHandle.invoke(obj);
于 2013-02-10T10:00:18.273 に答える