大家好:)我试图在一个类中选择正确的构造函数。下面是代码:
Constructor[] constructors = targetClass.getConstructors();
Constructor goodConstructor = null;
for (Constructor constructor : constructors) {
Class[] parameterTypes = constructor.getParameterTypes();
if (parameterTypes.length = 1 && parameterTypes[0].equals(Map.class)) {//here
goodConstructor = constructor;
}
}
我想从Map.class
切换到Map<String, String>.class
。我隐约记得泛型只用于编译时,所以这就是编译器抱怨的原因。如何在运行时检查类是否具有正确的构造函数?
你想用getGenericParameterTypes()
代替:
public class FindConstructor {
public static void main(String[] args) throws IOException {
for (Constructor<?> constructor : MyClass.class.getConstructors()) {
Type[] parameterTypes = constructor.getGenericParameterTypes();
if (parameterTypes.length == 1 && parameterTypes[0] instanceof ParameterizedType) {
ParameterizedType parameterizedArg = (ParameterizedType) parameterTypes[0];
if (parameterizedArg.getRawType() != Map.class) {
continue;
}
if (parameterizedArg.getActualTypeArguments()[0] != String.class) {
continue;
}
if (parameterizedArg.getActualTypeArguments()[1] != String.class) {
continue;
}
}
System.out.println("found constructor " + constructor);
}
}
}
class MyClass {
public MyClass(Map<String, String> map) {
}
}
现在如果你改变MyClass()
采取Map<String, Integer>
它将不再匹配。
对于Guava的TypeToken
来说,这变得更加容易,它利用一个匿名类来创建一个参数化的Type
,我们可以比较。
Type mapStringString = new TypeToken<Map<String, String>>(){}.getType();
for (Constructor<?> constructor : MyClass.class.getConstructors()) {
Type[] parameterTypes = constructor.getGenericParameterTypes();
if (parameterTypes.length == 1 && parameterTypes[0].equals(mapStringString)) {
System.out.println("found constructor " + constructor);
}
}
类在java中不是这样工作的。类不能在运行时参数化;唯一的实例。只有一个Map.class
,而不是(你似乎已经假设)每个通用的Map实现一个单独的类。下面的代码可能有助于澄清这一点:
Map<String,String> m1 = new HashMap<>();
Map<Object,Long> m2 = new HashMap<>();
System.out.println(m1.getClass() == m2.getClass());//prints "true"