Java反射getDeclaredMethods()返回两个版本的泛型重写方法



我需要使用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

我的问题是:

  1. 为什么getDeclaredMethods()输出两个方法而不是一个?如果test没有泛型参数,或者它将是B的新方法(未重写(,则getDeclaredMethods()将只输出一个方法,正如预期的那样
  2. 什么是过滤掉";错误的";方法,其中不包括泛型类型信息

正如Pshemo所指出的,第二种不太具体的方法是桥接方法(https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html)其被用作类型擦除的手段。

可以使用method.isBridge()来识别桥接方法。

最新更新