gpt4 book ai didi

java - 在运行时检查类是否具有使用泛型的特定构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:06:23 24 4
gpt4 key购买 nike

大家好 :) 我正在尝试在类中选择正确的构造函数。这是代码:

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 - 在运行时检查类是否具有使用泛型的特定构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16063840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com