Java Reflection getDeclaredMethods() returns 泛型覆盖方法的两个版本
Java Reflection getDeclaredMethods() returns two versions of generic overridden methods
我需要使用反射 API 来获取有关 class 中方法的方法参数的准确信息。
考虑以下最小示例:
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()
来识别桥接方法。
我需要使用反射 API 来获取有关 class 中方法的方法参数的准确信息。 考虑以下最小示例:
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()
来识别桥接方法。