gpt4 book ai didi

java - 如何通过传递 Object[] 而不是带反射的参数列表来创建类的新实例

转载 作者:搜寻专家 更新时间:2023-10-31 20:01:02 25 4
gpt4 key购买 nike

你知道如何编写这样的方法吗?

public abstract class AbstractClass{}

public class TrialClass extends AbstractClass{
public TrialClass(final String a, final String b){}
public TrialClass(final String a, final String b, final String c){}
}

public class getNewInstance(final Class<? extends AbstractClass> clazz, Object... constructorParameters){
//???
}

TrialClass trialClass = getNewInstance(TrialClass.class, "A", "B");

最佳答案

可能更灵活的方法是检查所有构造函数并找到兼容的构造函数,如下所示:

public static <T> T getNewInstance(final Class<T> clazz, Object... constructorParameters) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Constructor<?> candidate = null;
for(Constructor<?> constructor : clazz.getConstructors()) {
if(Modifier.isPublic(constructor.getModifiers()) && isConstructorCompatible(constructor, constructorParameters)) {
if(candidate == null)
candidate = constructor;
else
throw new IllegalArgumentException("Several constructors found which are compatible with given arguments");
}
}
if(candidate == null)
throw new IllegalArgumentException("No constructor found which is compatible with given arguments");
return (T) candidate.newInstance(constructorParameters);
}

private static boolean isConstructorCompatible(Constructor<?> constructor, Object[] constructorParameters) {
Class<?>[] parameterTypes = constructor.getParameterTypes();
if(parameterTypes.length != constructorParameters.length)
return false;
for(int i=0; i<parameterTypes.length; i++)
if(!isParameterCompatible(parameterTypes[i], constructorParameters[i]))
return false;
return true;
}

private static boolean isParameterCompatible(Class<?> type, Object parameter) {
if(parameter == null)
return !type.isPrimitive();
if(type.isInstance(parameter))
return true;
if(type.isPrimitive()) {
if (type == int.class && parameter instanceof Integer
|| type == char.class && parameter instanceof Character
|| type == byte.class && parameter instanceof Byte
|| type == short.class && parameter instanceof Short
|| type == long.class && parameter instanceof Long
|| type == float.class && parameter instanceof Float
|| type == double.class && parameter instanceof Double
|| type == boolean.class && parameter instanceof Boolean)
return true;
}
return false;
}

尽管像可变参数构造函数一样,仍然存在 Unresolved 问题。歧义情况也不会像 javac 那样解决(例如,如果您有 MyObj(Object)MyObj(String) 构造函数,您将无法使用后一个都是匹配的)。

关于java - 如何通过传递 Object[] 而不是带反射的参数列表来创建类的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33774723/

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