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("interface
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 );
}
}