Java getGenericParameterTypes和getParameterTypes之间的差异

Java getGenericParameterTypes和getParameterTypes之间的差异,java,reflection,Java,Reflection,我试图了解getGenericParameterTypes和getParameterTypes方法之间的区别。我知道一个返回Class[],另一个返回Type[]。但真正的区别是什么 考虑方法: public void method1(T arg1) public void method2(String arg2) 在每个示例方法上调用每个get方法时,我会得到什么?我不能确切地告诉您将得到什么,但一个区别是,对于方法2,您可以告诉参数类型是Class,而对于方法1,您只知道有一个名为t的参数

我试图了解
getGenericParameterTypes
getParameterTypes
方法之间的区别。我知道一个返回
Class[]
,另一个返回
Type[]
。但真正的区别是什么

考虑方法:

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

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

我不能确切地告诉您将得到什么,但一个区别是,对于方法2,您可以告诉参数类型是
Class
,而对于方法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();
class-Foo{
公共无效方法1(T arg1){…}
}
类栏扩展了Foo{…}
Foo-Foo=新的Foo();
条形=新条形();
对于
foo
,您无法在运行时(您不知道它是
Baz
)或编译时获取
T
的类型。对于
bar
,您可以获得
T
的类型,因为它在编译时就已经知道了

查看代码时的另一个区别:

在方法1上调用
getGenericParameterTypes()
应该返回
T
类型,在方法2上调用它应该返回
Class
。但是,如果调用
getTypeParameters()
方法1将获得
T
类型,而方法2将获得零长度数组

编辑:因为
getParameterTypes()
是指
getTypeParameters()
而不是
getTypeParameters()


对于方法2,没有区别,因为如果签名中没有使用泛型,
getGenericParameterTypes()
实际上调用
getParameterTypes()
。对于方法1,
getGenericParameterTypes()
将返回一个
ParameteredType
,该类型表示参数具有名称
T
,而
getParameterTypes()
将返回该类型所需的基类,例如,
可以返回其他类型的
类型
s
getParameterType
是“预泛型”反射。这意味着
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);
        }
    }

}

对不起,我弄错了。我的意思是
getParameterTypes
,而不是
getTypeParameters
。这是有区别的。我几乎没有注意到。您能否编辑您的答案以反映此更改?
with GPT: T
with PT: class java.lang.Object