9

Java の MethodHandle.invokeExact(Object...args) は、引数の可変長リストを取ります。ただし、リストの代わりに Object [] の配列を渡そうとすると、エラーが発生します。下記参照:

private void doIt() throws Throwable {

    Method meth = Foo.class.getDeclaredMethods()[0];

    MethodHandles.Lookup lookup = MethodHandles.lookup();
    MethodHandle mh = lookup.unreflect(meth);

    Foo foo = new Foo();
    String myStr = "aaa";
    Integer myInt = new Integer(10);
    Object [] myArray = {foo, myStr, myInt};

    mh.invokeExact(foo, myStr, myInt); // prints "Called aaa 10"
    mh.invokeExact(myArray); // throws Exception
}

class Foo {
    public void bar(String myStr, Integer myInt) {
        System.out.println("Called " + myStr + " " + myInt);
    }
}

invokeExact() の 2 回目の呼び出しで、次の例外が生成されます。

Exception in thread "main" java.lang.invoke.WrongMethodTypeException: (Ljava/lang/String;Ljava/lang/Integer;)V cannot be called with a different arity as ([Ljava/lang/Object;)V
    at io.rhubarb.core.TestInvoke.doIt0(TestInvoke.java:26)
    at io.rhubarb.core.TestInvoke.main(TestInvoke.java:11)

これは、2 年前に修正された Eclipse のバグ ( https://bugs.eclipse.org/bugs/show_bug.cgi?id=385404 ) に関連している可能性がありますが、Eclipse を閉じると、 /target ディレクトリを削除し、Maven を使用してすべてを再コンパイルし、コマンド ラインから実行しても同じ結果が得られます。

私は Eclipse Kepler SR2 を使用しており、すべてが完全に最新で、JDK 1.7.0_25 です。

4

1 に答える 1