次のようなデモコードがあります。
Class<?> myClass = cl.loadClass("com.hp.ac.scriptengine.test." + generateClassName);
Object my_obj = myClass.newInstance();
MethodType mt;
MethodHandle mh;
MethodHandles.Lookup lookup = MethodHandles.lookup();
mt = MethodType.methodType(void.class, int.class);
mh = lookup.findVirtual(my_obj.getClass(), "ToDoit", mt);
mh.invokeExact(my_obj,1);
ここでは「com.hp.ac.scriptengine.test.」+ generateClassName' は生成されたクラスです。以下のようなメッセージが届きました。
java.lang.invoke.WrongMethodTypeException: (I)V cannot be called as (Ljava/lang/Object;I)V
at com.hp.ac.scriptengine.test.compliebyCommandline.main(compliebyCommandline.java:138)
ここで 138 行目はmh.invokeExact(my_obj,1);
'
mh.invokeExact("daddy",'d','n')...
Java 7 APIドキュメントでそのデモコード( ... など)を試しました。それは正常に動作します。そのような call( mh.invokeExact("daddy",'d','n')
)(CC)Ljava/lang/String
は、 以外を呼び出すだけです(Ljava/lang/String;CC)Ljava/lang/String
。しかし、なぜ私のコードでmh.invokeExact(my_obj,1)
(I)V 以外の (Ljava/lang/Object;I)V を呼び出すのでしょうか?