Go Back   Velocity Reviews > Newsgroups > Java
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

Reply

Java - How would you invoke arrayList.get() through reflection in 1.4 ??

 
Thread Tools Search this Thread
Old 11-05-2009, 02:47 PM   #1
Default How would you invoke arrayList.get() through reflection in 1.4 ??


Hi,

It seems to be pretty hard to invoke the List get(int) method through
reflection. I didn't manage to have my code working with my 1.4
compiler.
To sum up I do the following:

Method method;
method = [some more code...];
if (method.getReturnType().toString().equals("interfa ce
java.util.List"))
{

// how many refs does our List contain ?
int n = sizeOfCollection(method.invoke(root, (Object[])null));

// let's get the actual list
Object list = method.invoke(root, (Object[])null);

// now trying to invoke its 'get()' for every element it
// contains:
Class listClass = Class.forName(list.getClass().getName());
Method m2 = listClass.getDeclaredMethod("get", ???); //<= what to
put here ?

for (int i=0; i<n; i++) {
Object o = m2.invoke(list, i); //<= doesn't compile
...
}
[...]
}

private int sizeOfCollection(Object obj)
{
return new StringTokenizer(obj.toString(), ",").countTokens();
}

In Java5 I managed to reach a point where I could traverse
all references contained in a List, and display them, but in 1.4,
no way: if someone every succeeded doing that, I'd be glad to
hear how you did it... Thanks a lot in advance !

Regards,
Seb


Sébastien de Mapias
  Reply With Quote
Old 11-05-2009, 03:46 PM   #2
markspace
 
Posts: n/a
Default Re: How would you invoke arrayList.get() through reflection in 1.4??
Sébastien de Mapias wrote:
> Hi,
>
> It seems to be pretty hard to invoke the List get(int) method through
> reflection. I didn't manage to have my code working with my 1.4
> compiler.


It isn't. Your code is pretty bad. I'll make some more comments about
that in a sec, you're making things way harder than need to be. First,
a direct answer to your question:

Method m = obj.getClass().getMethod( "get", Integer.TYPE );

Likely you have "Integer.class" or similar, you have to use the type for
a primitive, not the object Integer.

Ok, on to comments.


> To sum up I do the following:
>
> Method method;
> method = [some more code...];
> if (method.getReturnType().toString().equals("interfa ce
> java.util.List"))



That line above drives me nuts. Why do a string compare? Why not just
compare to the class itself?


> if (method.getReturnType() == List.class )



Not sure what the confusion is with that.


> {
>
> // how many refs does our List contain ?
> int n = sizeOfCollection(method.invoke(root, (Object[])null));



That line is a terrible idea. More later.


>
> // let's get the actual list
> Object list = method.invoke(root, (Object[])null);



At this point you could just cast to a list, you know. This is the
biggest "wtf?" in your code for me.

List<?> list = (List) obj;
for( Object o : list ) {
System.out.println( o );
}

There's your "reflective" way to get all members of the list from an Object.


>
> // now trying to invoke its 'get()' for every element it
> // contains:
> Class listClass = Class.forName(list.getClass().getName());
> Method m2 = listClass.getDeclaredMethod("get", ???); //<= what to
> put here ?


See above.

>
> for (int i=0; i<n; i++) {
> Object o = m2.invoke(list, i); //<= doesn't compile
> ...
> }


Ditto.

> [...]
> }
>
> private int sizeOfCollection(Object obj)
> {
> return new StringTokenizer(obj.toString(), ",").countTokens();
> }


A close second place for "wtf?". Please. What if your string(s)
contain commas themselves? This can't work in the general case. Bad
bad code, bad idea. Just cast to a list and then call the normal
methods, like ".size()".



Here's my reflective example:

package oldlist;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;


public class Main {
public static void main(String[] args) throws NoSuchMethodException
{
Object x = Arrays.asList( "red", "fish", "blue", "fish" );
reflectList( x );
}

private static void reflectList( Object obj )
throws NoSuchMethodException
{
if( obj instanceof List ) {
List<?> list = (List) obj;
for( Object o : list ) {
System.out.println( o );
}
}
Method m = obj.getClass().getMethod( "get", Integer.TYPE );
System.out.println( m );
}
}


markspace
  Reply With Quote
Old 11-05-2009, 05:25 PM   #3
Mike Schilling
 
Posts: n/a
Default Re: How would you invoke arrayList.get() through reflection in 1.4 ??
markspace wrote:
> Sébastien de Mapias wrote:
>> Hi,
>>
>> It seems to be pretty hard to invoke the List get(int) method
>> through
>> reflection. I didn't manage to have my code working with my 1.4
>> compiler.

>
> It isn't. Your code is pretty bad. I'll make some more comments
> about that in a sec, you're making things way harder than need to
> be.
> First, a direct answer to your question:
>
> Method m = obj.getClass().getMethod( "get", Integer.TYPE );


I was going to correct you, but checked first and saw that getMethod()
is now declared as varargs. Very handy.






Mike Schilling
  Reply With Quote
Old 11-05-2009, 05:43 PM   #4
markspace
 
Posts: n/a
Default Re: How would you invoke arrayList.get() through reflection in 1.4??
Mike Schilling wrote:

> markspace wrote:
>> First, a direct answer to your question:
>>
>> Method m = obj.getClass().getMethod( "get", Integer.TYPE );

>
> I was going to correct you, but checked first and saw that getMethod()
> is now declared as varargs. Very handy.



Ah ha.... I had set my compiler flags to -source 1.4 -target 1.4, but
apparently there's still a few sneaky things that don't get checked
directly. I didn't look at the 1.4 docs closely enough, I suppose.

Method m=obj.getClass().getMethod("get",new Class[]{Integer.TYPE});

Seems to work for me also, and I suspect will work on an older compiler
as well.



markspace
  Reply With Quote
Old 11-05-2009, 06:30 PM   #5
Lew
 
Posts: n/a
Default Re: How would you invoke arrayList.get() through reflection in 1.4 ??
Sébastien de Mapias wrote:
>>> ... working with my 1.4 compiler.

>


markspace wrote:
>> First, a direct answer to your question:

>
>> * *Method m = obj.getClass().getMethod( "get", Integer.TYPE );

>


Mike Schilling wrote:
> I was going to correct you, but checked first and saw that getMethod()
> is now declared as varargs. *Very handy.
>


The varargs feature wasn't introduced until Java 5. Go ahead and
correct him.

--
Lew


Lew
  Reply With Quote
Old 11-06-2009, 03:44 PM   #6
MikisM
 
Posts: n/a
Default Re: How would you invoke arrayList.get() through reflection in 1.4 ??
> * * * * * *List<?> list = (List) obj;
> * * * * * *for( Object o : list ) {
> * * * * * * * System.out.println( o );
> * * * * * *}
> * * * * }


I'm not 100% sure but weren't generics (<?> in this case) included in
1.5 version? The code should not compile with 1.4.


MikisM
  Reply With Quote
Old 11-06-2009, 04:34 PM   #7
markspace
 
Posts: n/a
Default Re: How would you invoke arrayList.get() through reflection in 1.4??
MikisM wrote:
>> List<?> list = (List) obj;
>> for( Object o : list ) {
>> System.out.println( o );
>> }
>> }

>
> I'm not 100% sure but weren't generics (<?> in this case) included in
> 1.5 version? The code should not compile with 1.4.



Yup, and that for( loop doesn't work either under 1.4. I put -source
1.4 on the compile line for javac, but it didn't work. Up further in
the same dialog there's a sources tab, with a drop down for the source
revision. Setting it there works. This is using Netbeans, under the
project Properties.

Thanks for provoking me into figuring this out.



markspace
  Reply With Quote
Old 11-06-2009, 08:46 PM   #8
Daniel Pitts
 
Posts: n/a
Default Re: How would you invoke arrayList.get() through reflection in 1.4??
Sébastien de Mapias wrote:
> Hi,
>
> It seems to be pretty hard to invoke the List get(int) method through
> reflection. I didn't manage to have my code working with my 1.4
> compiler.

Why? Why not use ((List)obj).get(i);
That is *much* easier than using reflection.

> To sum up I do the following:
>
> Method method;
> method = [some more code...];
> if (method.getReturnType().toString().equals("interfa ce
> java.util.List"))
> {
>
> // how many refs does our List contain ?
> int n = sizeOfCollection(method.invoke(root, (Object[])null));
>
> // let's get the actual list
> Object list = method.invoke(root, (Object[])null);
>
> // now trying to invoke its 'get()' for every element it
> // contains:
> Class listClass = Class.forName(list.getClass().getName());
> Method m2 = listClass.getDeclaredMethod("get", ???); //<= what to
> put here ?
>
> for (int i=0; i<n; i++) {
> Object o = m2.invoke(list, i); //<= doesn't compile
> ...
> }
> [...]
> }
>
> private int sizeOfCollection(Object obj)
> {
> return new StringTokenizer(obj.toString(), ",").countTokens();
> }
>
> In Java5 I managed to reach a point where I could traverse
> all references contained in a List, and display them, but in 1.4,
> no way: if someone every succeeded doing that, I'd be glad to
> hear how you did it... Thanks a lot in advance !
>
> Regards,
> Seb





Daniel Pitts
  Reply With Quote
Old 11-07-2009, 01:02 AM   #9
Lew
 
Posts: n/a
Default Re: How would you invoke arrayList.get() through reflection in 1.4??
markspace wrote:
> MikisM wrote:
>>> List<?> list = (List) obj;
>>> for( Object o : list ) {
>>> System.out.println( o );
>>> }
>>> }

>>
>> I'm not 100% sure but weren't generics (<?> in this case) included in
>> 1.5 version? The code should not compile with 1.4.

>
>
> Yup, and that for( loop doesn't work either under 1.4. I put -source
> 1.4 on the compile line for javac, but it didn't work. Up further in
> the same dialog there's a sources tab, with a drop down for the source
> revision. Setting it there works. This is using Netbeans, under the
> project Properties.
>
> Thanks for provoking me into figuring this out.


you probably also needed "-target 1.4" and perhaps even
"-bootclasspath $JDK14/rt.jar"

--
Lew


Lew
  Reply With Quote
Old 11-07-2009, 01:38 AM   #10
markspace
 
Posts: n/a
Default Re: How would you invoke arrayList.get() through reflection in 1.4??
Lew wrote:

>
> you probably also needed "-target 1.4" and perhaps even


I had that, it didn't seem to work either.

Under Properties -> Libraries, there's a "Java Platform" drop down menu.
I don't have Java 1.4 installed, so I can't check, but I'm going to
guess that switching that menu will enable NetBeans to use a different
JDK and also set the -target flag correctly.


> "-bootclasspath $JDK14/rt.jar"
>



markspace
  Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are Off

Similar Threads
Thread Thread Starter Forum Replies Last Post
Reflection Mutiple Promts rmoneype Software 0 05-08-2008 01:49 AM
Attachmate / WRQ Reflection Macro Errors John Computer Information 0 12-12-2006 10:12 PM
looking for another way to invoke "scan for hardware changes" Jack B. Pollack Computer Support 3 11-15-2005 01:56 AM
gospel and reflection neil20002us@yahoo.com Computer Support 1 08-16-2005 01:08 AM
gospel and reflection neil20002us@yahoo.com Computer Support 1 08-16-2005 12:31 AM




SEO by vBSEO 3.3.2 ©2009, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46