我一直在阅读一些地方,但我无法找到最佳解决方案,他们正在使用
Class tempClass = Class.forName(classname);
Constructor constructor = tempClass.getDeclaredConstructor(String.class);
他们定义了他们的params类型,但是如果tempClass是动态的,当然他们有不同的构造函数params吗?
有解决此问题的解决方法吗?
答案 0 :(得分:1)
了解getDeclaredConstructors()
的定义方式:
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Class<?>...
表示法表示该方法为variadic。它将Class对象列表作为参数,有两种方法可以提供该列表:
您可以将对象列为单独的参数:
Constructor<?> ctor = getDeclaredConstructor(String.class, String.class, Integer.class, etc)
您可以构造一个数组并将该数组作为单个参数传递
Class<?>[] classes = new Class<?>[3];
classes[0] = String.class;
...
Constructor<?> ctor = getDeclaredConstructor(classes);
要在不事先知道它有多少参数或类型是什么的情况下找到构造函数,您可以使用第二种方法 - 构造一个描述您要查找的参数列表的数组,然后使用该数组作为参数调用getDeclaredConstructor()
。这是一个例子:
static <T> T construct(Class<T> aClass, Object...args)
throws NoSuchMethodException, SecurityException,
InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
Class<?>[] classes = new Class<?>[args.length];
for (int ii = 0; ii < args.length; ++ii) {
classes[ii] = args[ii].getClass();
}
Constructor<T> ctor = aClass.getDeclaredConstructor(classes);
return ctor.newInstance(args);
}
...
String abc = construct(String.class, "abc");
URL google = construct(URL.class, "http", "google.com", "/");
答案 1 :(得分:0)
您需要使用您期望的类型参数重载构造函数。这称为编译时多态。例如,您希望构造函数处理int float和char参数。您需要使用这些参数重载构造函数。这样它就可以动态处理不同的参数。
Example:
Constructor(int a, int b);
Constructor(char a, char b);
Constructor(float a, float b);