如何通过检查找到返回类型的参数化类型?

2 java generics reflection

我正在使用反射来获取所有类中的所有方法:

Method[] allMethods = c.getDeclaredMethods();
Run Code Online (Sandbox Code Playgroud)

之后,我正在迭代这些方法

for (Method m: allMethods){
    //I want to find out if the return is is a parameterized type or not
    m.getReturnType();
}
Run Code Online (Sandbox Code Playgroud)

例如:如果我有这样的方法:

public Set<Cat> getCats();
Run Code Online (Sandbox Code Playgroud)

如何使用反射来查找返回类型包含Cat的参数化类型?

Mic*_*ers 8

你试过getGenericReturnType()吗?

返回一个Type对象,该Method对象表示此对象表示的方法的正式返回类型.

如果返回类型是参数化类型,则Type返回的对象必须准确反映源代码中使用的实际类型参数.

如果返回类型是类型变量或参数化类型,则会创建它.否则,它就解决了.

然后(从查看Javadocs),似乎你必须将它投射ParameterizedType并调用getActualTypeArguments()它.

所以这里是一些示例代码:

    for (Method m : allMethods) {
        Type t = m.getGenericReturnType();
        if (t instanceof ParameterizedType) {
            System.out.println(t);       // "java.util.Set<yourpackage.Cat>"
            for (Type arg : ((ParameterizedType)t).getActualTypeArguments()) {
                System.out.println(arg); // "class yourpackage.Cat"
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)