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()
将返回该类型所需的基类,例如,
的类
或的类
可以返回其他类型的类型
sgetParameterType
是“预泛型”反射。这意味着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