我需要使用Reflection API来获取类中方法的方法参数的确切信息。考虑以下最小示例:
public class A<T> {
void test(T t, List<String> l) {}
}
public class B extends A<Integer> {
@Override
void test(Bar t, List<String> l) {}
}
public class Main{
public static void main() {
Method[] methods = B.class.getDeclaredMethods();
for (Method m : methodsB) {
System.out.println(m);
System.out.println(m.getGenericParameterTypes()[1] instanceof ParameterizedType)
}
}
}
这将导致
void B.test(java.lang.Integer,java.util.List)
true
void B.test(java.lang.Object,java.util.List)
false
我的问题是:
- 为什么
getDeclaredMethods()
输出两个方法而不是一个?如果test
没有泛型参数,或者它将是B
的新方法(未重写(,则getDeclaredMethods()
将只输出一个方法,正如预期的那样 - 什么是过滤掉";错误的";方法,其中不包括泛型类型信息
正如Pshemo所指出的,第二种不太具体的方法是桥接方法(https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html)其被用作类型擦除的手段。
可以使用method.isBridge()
来识别桥接方法。