getGenericParameterTypes和getParameterTypes之间的区别

时间:2011-07-19 12:47:25

标签: java reflection

我正在尝试了解getGenericParameterTypesgetParameterTypes方法之间的区别。我知道其中一个返回Class[]而另一个Type[]。但真正的区别是什么?

考虑方法:

public void method1(T arg1)
public void method2(String arg2)

在每个示例方法上调用每个get方法时会得到什么?

2 个答案:

答案 0 :(得分:7)

我无法准确地告诉你你会得到什么,但一个区别是,对于方法2,你可以告诉参数类型是Class<String>而对于方法1,你只知道有一个名为{{的参数1}},但是你不知道确切的类型,除了声明T的类将被T的具体类子类化。

示例:

T

对于class Foo<T> { public void method1( T arg1 ) { ... } } class Bar extends Foo<Baz> { ... } Foo<?> foo = new Foo<Baz>(); Bar bar = new Bar(); ,您无法在运行时获取foo的类型(您不知道它是T),也不能在编译时获取。对于Baz,您可以获得bar的类型,因为它在编译时已经知道。

查看代码时的另一个不同之处:

在方法1上调用T应该返回getGenericParameterTypes()类型,为方法2调用它应该返回T。但是,如果您致电Class<String>,您将获得方法1的getTypeParameters()类型,但方法2的零长度数组。

编辑:由于T代表getParameterTypes()而不是getTypeParameters(),我可以从代码中看到差异:

对于方法2,没有区别,因为如果签名中没有使用泛型,getGenericParameterTypes()实际上会调用getParameterTypes()。对于方法1,getGenericParameterTypes()将返回ParameterizedType,表示参数名称为T,而getParameterTypes()将返回该类型所需的基类,例如Class<Object><T>Class<Number><T extends Number>

答案 1 :(得分:5)

getGenericParameterTypes可以返回其他类型的TypegetParameterType是“前仿制药”的反映。这意味着T将被视为java.lang.Object。检查此示例:

public class Generics<T> {

    public void method1(T t) {
    }

    public static void main(String[] args) throws Exception {
        Method m = Generics.class.getMethod("method1", Object.class);
        for (Type t : m.getGenericParameterTypes()) {
            System.out.println("with GPT: " + t);
        }
        for (Type t : m.getParameterTypes()) {
            System.out.println("with PT: " + t);
        }
    }

}

输出结果为:

with GPT: T
with PT: class java.lang.Object