I got every methods in my package using reflections and then based on the return type of every method, I want to do some operations.
But unfortunately I had a problem with collections. when I find a method in which return a collection like a List, I can't find a way to get to know about the type of List's element.
I used the code below to get the return type of my methods.
if (method.getReturnType().equals(List.class)){
statement;
}
The above code does work well and gets every method which return a List but it is just return java.util.List as a return type and I can't find a way to get to know about the type of element in that List.
For instance, if I have a method like this:
public List<CmsCustomerModel> getCustomerModel(){
statement;
}
I don't know how can I get CmsCustomerModel class as a type of element for return List. I would be wonder if anyone help me find this. Please guide me.
You can use getGenericReturnType
which returns a Type
rather than a Class
, and allows you to get at all the type arguments etc. Short but complete example:
import java.lang.reflect.*;
import java.util.*;
public class Test {
public static void main(String [] args) {
for (Method method : Test.class.getMethods()) {
System.out.println(method.getName());
Type type = method.getGenericReturnType();
System.out.println("Return type: " + type.getTypeName());
if (type instanceof ParameterizedType)
{
ParameterizedType pt = (ParameterizedType) type;
System.out.println("Parameterized: " + pt.getRawType());
for (Type arg : pt.getActualTypeArguments())
{
System.out.println(" " + arg);
}
}
}
}
public static List<Integer> getNumbers() {
return null;
}
public static List<String> getStrings() {
return null;
}
}
Output includes:
getStrings
Return type: java.util.List<java.lang.String>
Parameterized: interface java.util.List
class java.lang.String
getNumbers
Return type: java.util.List<java.lang.Integer>
Parameterized: interface java.util.List
class java.lang.Integer