Hi Rony I can't see anything wrong with the behaviour of invokeWithArguments here, but the Method.invoke is odd. Considering that: Arrays.asList(arrNames); works as intended, it's quite reasonable that
mh.invokeWithArguments(arrNames); behaves the same. So if anything, it's Method.invoke which is surprising. -Jesper On 8 Jun 2018, at 14.00, mlvm-dev-requ...@openjdk.java.net wrote: > > Send mlvm-dev mailing list submissions to > mlvm-dev@openjdk.java.net > > To subscribe or unsubscribe via the World Wide Web, visit > http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev > or, via email, send a message with subject or body 'help' to > mlvm-dev-requ...@openjdk.java.net > > You can reach the person managing the list at > mlvm-dev-ow...@openjdk.java.net > > When replying, please edit your Subject line so it is more specific > than "Re: Contents of mlvm-dev digest..." > > > Today's Topics: > > 1. Re: A pure Java example with reflective access behaving > differently with invokeWithArguments() compared to core > reflection's invoke() (Re: Strange observation: > MethodHandle.invokeWithArguments() would not work, whereas > Method.invoke() would with the very same arguments (Rony G. Flatscher) > > > ---------------------------------------------------------------------- > > Message: 1 > Date: Fri, 8 Jun 2018 12:07:53 +0200 > From: "Rony G. Flatscher" <rony.flatsc...@wu.ac.at> > To: mlvm-dev@openjdk.java.net > Subject: Re: A pure Java example with reflective access behaving > differently with invokeWithArguments() compared to core reflection's > invoke() (Re: Strange observation: MethodHandle.invokeWithArguments() > would not work, whereas Method.invoke() would with the very same > arguments > Message-ID: <79695c18-ca46-fd68-6dcb-024018c31...@wu.ac.at> > Content-Type: text/plain; charset="utf-8" > > On 11.03.2018 20:22, Rony G. Flatscher wrote: >> Well, still trying to find out what the reason is, that core reflection's >> invoke behaves >> differently to MethodHandle's invokeWithArguments in one single case so far >> (using the method >> java.utli.Arrays.asList(...)). >> >> Here is a little Java program that excercises reflective access to >> "java.util.Arrays.asList?(T...?a)" using core reflection, i.e. >> "Method.invoke?(Object obj, >> Object... args)" and "MethodHandle.invokeWithArguments?(Object... >> arguments)": >> >> import java.util.*; >> >> import java.lang.reflect.*; >> import java.lang.invoke.*; >> >> class DemoAsListProblem >> { >> public static void main (String args[]) >> { >> String arrNames[]=new String[] { "anne", "bert", "celine"}; >> System.out.println("[1] (main) arrNames=\""+arrNames+"\", >> .toString()=\""+arrNames.toString()+"\""); >> List listNames=Arrays.asList(arrNames); >> System.out.println("[2] (main) after invoking >> Arrays.asList(arrNames), listNames=\""+listNames+"\""); >> System.out.println("\ninvoking testReflective() ...\n"); >> >> testReflective(); >> } >> >> public static void testReflective() >> { >> String arrNames[]=new String[] { "anne", "bert", "celine"}; >> System.out.println("[3] (testReflective) >> arrNames=\""+arrNames+"\", .toString()=\""+arrNames.toString()+"\""); >> >> Method methAsList=null; >> List listNames=null; >> try { >> Class paramTypes[]=new Class[] { (new Object[0]).getClass() }; >> methAsList=Arrays.class.getDeclaredMethod("asList", >> paramTypes); >> System.out.println("--- (core reflection) Method object >> asList: "+methAsList); >> System.out.println("\n--- (core reflection) now invoking >> Arrays.asList() via Method.invoke(...):"); >> >> listNames=(List) methAsList.invoke( null, (Object[]) new >> Object[]{arrNames} ); // static method >> System.out.println("[4a] --- (CR) methAsList.invoke( null, >> (Object[]) new Object[]{arrNames} ) -> listNames=\""+listNames+"\""); >> >> listNames=(List) methAsList.invoke( null, (Object) new >> Object[]{arrNames} ); // static method >> System.out.println("[4b] --- (CR) methAsList.invoke( null, >> (Object) new Object[]{arrNames} ) -> listNames=\""+listNames+"\""); >> >> // "java.lang.IllegalArgumentException: wrong number of arguments": >> // listNames=(List) methAsList.invoke( null, (Object[]) >> arrNames ); // static method >> // System.out.println("[5a] --- (CR) methAsList.invoke( null, >> (Object[]) arrNames ) -> listNames=\""+listNames+"\""); >> >> listNames=(List) methAsList.invoke( null, (Object) arrNames >> ); // static method >> System.out.println("[5b] --- (CR) methAsList.invoke( null, >> (Object) arrNames ) -> listNames=\""+listNames+"\""); >> } >> catch (Throwable t) >> { >> System.err.println("oops #1: "+t); >> t.printStackTrace(); >> System.exit(-1); >> } >> >> System.out.println("\n--- (MH) now invoking Arrays.asList() via >> MethodHandle.invokeWithArguments(...):"); >> MethodHandles.Lookup lookup=MethodHandles.lookup(); >> MethodHandle mh=null; >> try { >> mh=lookup.unreflect(methAsList); >> System.out.println("--- (MH) unreflected MethodHandle mh: >> "+mh); >> >> listNames=(List) mh.invokeWithArguments( (Object[]) new >> Object[]{arrNames} ); >> System.out.println("[6a] --- (MH) mh.invokeWithArguments( >> (Object[]) new Object[]{arrNames} ) -> listNames=\""+listNames+"\""); >> >> listNames=(List) mh.invokeWithArguments( (Object) new >> Object[]{arrNames} ); >> System.out.println("[6b] --- (MH) mh.invokeWithArguments( >> (Object) new Object[]{arrNames} ) -> listNames=\""+listNames+"\""); >> >> listNames=(List) mh.invokeWithArguments( (Object[]) arrNames >> ); >> System.out.println("[7a] --- (MH) mh.invokeWithArguments( >> (Object[]) arrNames ) -> listNames=\""+listNames+"\""); >> >> listNames=(List) mh.invokeWithArguments( (Object) arrNames ); >> System.out.println("[7b] --- (MH) mh.invokeWithArguments( >> (Object) arrNames ) -> listNames=\""+listNames+"\""); >> >> } >> catch (Throwable t) >> { >> System.err.println("oops #2: "+t); >> t.printStackTrace(); >> System.exit(-2); >> } >> } >> } >> >> Compiling and running it under 9.0.4 yields the following output: >> >> [1] (main) arrNames="[Ljava.lang.String;@27ddd392", >> .toString()="[Ljava.lang.String;@27ddd392" >> [2] (main) after invoking Arrays.asList(arrNames), listNames="[anne, >> bert, celine]" >> >> invoking testReflective() ... >> >> [3] (testReflective) arrNames="[Ljava.lang.String;@2a18f23c", >> .toString()="[Ljava.lang.String;@2a18f23c" >> --- (core reflection) Method object asList: public static java.util.List >> java.util.Arrays.asList(java.lang.Object[]) >> >> --- (core reflection) now invoking Arrays.asList() via Method.invoke(...): >> [4a] --- (CR) methAsList.invoke( null, (Object[]) new Object[]{arrNames} >> ) -> listNames="[anne, bert, celine]" >> [4b] --- (CR) methAsList.invoke( null, (Object) new Object[]{arrNames} >> ) -> listNames="[[Ljava.lang.String;@2a18f23c]" >> [5b] --- (CR) methAsList.invoke( null, (Object) arrNames ) >> -> listNames="[anne, bert, celine]" >> >> --- (MH) now invoking Arrays.asList() via >> MethodHandle.invokeWithArguments(...): >> --- (MH) unreflected MethodHandle mh: MethodHandle(Object[])List >> [6a] --- (MH) mh.invokeWithArguments( (Object[]) new Object[]{arrNames} >> ) -> listNames="[[Ljava.lang.String;@2a18f23c]" >> [6b] --- (MH) mh.invokeWithArguments( (Object) new Object[]{arrNames} >> ) -> listNames="[[Ljava.lang.Object;@13a57a3b]" >> [7a] --- (MH) mh.invokeWithArguments( (Object[]) arrNames ) >> -> listNames="[anne, bert, celine]" >> [7b] --- (MH) mh.invokeWithArguments( (Object) arrNames ) >> -> listNames="[[Ljava.lang.String;@2a18f23c]" >> >> So a String array is turned into a List using Arrays.asList(strArray). Doing >> it with core >> reflection yields different results to doing it with invokeWithArguments(). >> >> I would have expected that [4a] and [6a] would behave the same. >> >> Using reflective invoke() and invokeWithArguments() has been working for my >> bridge for all the >> test units (using literally the same arguments in both cases) >> interchangeably, the one exception >> is Arrays.asList(). >> >> Maybe I am not seeing the obvious (having done too much "close-up tests" for >> quite some time now). >> So any hint, insight, help would be really appreciated! >> >> ---rony > As a few months have gone by without any follow-ups, I have been wondering > whether there is a > solution at all, if this is a problem rooted in the current implementation of > MethodHandle methods > not being 100% compatible with reflective invoke (which may imply that one > needs to stick to use > reflective invoke and forgo MethodHandle invokes for good). > > ---rony
_______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev