That will produce a

java.lang.invoke.WrongMethodTypeException: 
(Ljava/lang/Object;[Ljava/lang/Object;)V cannot be called without a 
receiver argument as ([Ljava/lang/Object;)Ljava/lang/Object;

imho casting to Object and Object[] in

mh.invokeExact((Object)Class.class, (Object[])new Class[0]);

is without effect, since invokeExact is a vargs method an everything 
will just be put into an Object[] anyway. We had not a compiler change 
for this kind of thing, had we?

bye Jochen

Am 07.02.2012 17:52, schrieb Jim Laskey:
> Try
>
>         MethodType type = MethodType.methodType(Constructor.class, 
> Class[].class);
>         MethodHandle mh = MethodHandles.lookup().findVirtual(Class.class, 
> "getDeclaredConstructor", type);
>         MethodType target = MethodType.methodType(void.class, Object.class, 
> Object[].class);
>         mh = MethodHandles.explicitCastArguments(mh, target);
>         mh.invokeExact((Object)Class.class, (Object[])new Class[0]);
>
> Cheers,
>
> -- Jim
>
> On 2012-02-07, at 12:37 PM, Jochen Theodorou wrote:
>
>> Am 07.02.2012 17:29, schrieb Jim Laskey:
>>>>>>         MethodType type = MethodType.methodType(Constructor.class, 
>>>>>> Class[].class);
>>>>>>         MethodHandle mh = 
>>>>>> MethodHandles.lookup().findVirtual(Class.class, 
>>>>>> "getDeclaredConstructor", type);
>>>>>>         MethodType target = MethodType.methodType(Object.class, 
>>>>>> Object.class, Object.class);
>>>>>>         mh = mh.asType(target);
>>>>>>         mh.invokeWithArguments(Class.class,new Class[0]);
>>>
>>> As soon as you  mh = mh.asType(target); it is no longer vararg, so it
>>> is treating new Class[0] as the second argument cast to Object.  If
>>> you are trying to type as (Object , Object[]). I think you are going
>>> to run into difficulties validating (Class[]) Object[].  You may have
>>> to add a wrapper to get what you want, but you could also try using
>>> asCollector.
>>
>> or in other words: I should not use invokeWithArguments for this.
>>
>> If I wanted to use the same target type... since that is what my call site 
>> gives me... and I wanted to use invokeExact instead, how would I have to 
>> change the program?
>>
>> bye blackdrag
>>
>> --
>> Jochen "blackdrag" Theodorou - Groovy Project Tech Lead
>> blog: http://blackdragsview.blogspot.com/
>> german groovy discussion newsgroup: de.comp.lang.misc
>> For Groovy programming sources visit http://groovy-lang.org
>>
>


-- 
Jochen "blackdrag" Theodorou - Groovy Project Tech Lead
blog: http://blackdragsview.blogspot.com/
german groovy discussion newsgroup: de.comp.lang.misc
For Groovy programming sources visit http://groovy-lang.org

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to