java - 如何从参数化类型方法参数中获取参数化类型类?

标签 java generics reflection parameters

考虑这个人为设计的类:

import java.util.List;
public class Test {
    public String chooseRandom(List<String> strings) {
        return null;
    }
}

当使用反射检查这个方法时,我怎样才能得到 Class表示 java.lang.String 的对象(甚至是字符串 "java.lang.String" )在查看 chooseRandom 的参数时?

我知道 Java 在编译时删除类型,但它们必须仍然存在,因为 javap可以正确打印它们。正在运行 javap在这个编译类上的结果是:

Compiled from "Test.java"
public class Test {
  public Test();
  public java.lang.String chooseRandom(java.util.List<java.lang.String>);
}

java.util.List 的参数化类型( java.lang.String ) 绝对可用...我只是不知道它是什么。

我已经试过了:

Class clazz = [grab the type of chooseRandom's parameter list's first argument];
String typeName = clazz.getName();
TypeVariable[] genericTypes = clazz.getTypeParameters();
if(null != genericTypes && 0 < genericTypes.length)
{
    boolean first = true;
    typeName += "<";
    for(TypeVariable type : genericTypes)
    {
        if(first) first = false;
        else typeName += ",";

        typeName += type.getTypeName();
    }

    typeName = typeName + ">";
}

这给了我一个 typeNamejava.util.List<E> .我希望的是 java.util.List<java.lang.String> .

我已经阅读了一些关于 SO 的其他问题和答案,但它们似乎都没有真正回答这个问题,或者即使他们回答了,也没有与之相关的工作代码并且解释......很薄。

最佳答案

使用 getGenericParameterTypesgetActualTypeArguments方法:

Method m = Test.class.getMethod("chooseRandom", List.class);
Type t = m.getGenericParameterTypes()[0];
// we know, in this case, that t is a ParameterizedType
ParameterizedType p = (ParameterizedType) t;
Type s = p.getActualTypeArguments()[0]; // class java.lang.String

在实践中,如果您不知道至少有一个参数并且它是通用的并且具有一种类型参数,那么您当然必须添加一些检查。

关于java - 如何从参数化类型方法参数中获取参数化类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28354509/

相关文章:

c# - 使用 yield return 返回泛型参数

c# - 使用反射的对象与单元中的目标类型不匹配

java - Selenium 元素位置

java - JOGL透明背景

java - “镜像”二维数组 [Java]

java - 尝试按照 URL 然后下载图像

python - django:根据 get_context_data 中的 get_queryset 结果进行计算

java - 有没有一种简单的方法可以返回整数值和/或 double 值?

java - 如何以反射方式打印方法主体?

c# - 通过匹配其属性来填充类