如何在java中使用动态参数获取构造函数

时间:2017-09-24 12:13:03

标签: java android

我一直在阅读一些地方,但我无法找到最佳解决方案,他们正在使用

Class tempClass = Class.forName(classname);
Constructor constructor = tempClass.getDeclaredConstructor(String.class);

他们定义了他们的params类型,但是如果tempClass是动态的,当然他们有不同的构造函数params吗?

有解决此问题的解决方法吗?

2 个答案:

答案 0 :(得分:1)

了解getDeclaredConstructors()的定义方式:

public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

Class<?>...表示法表示该方法为variadic。它将Class对象列表作为参数,有两种方法可以提供该列表:

  1. 您可以将对象列为单独的参数:

    Constructor<?> ctor = getDeclaredConstructor(String.class, String.class, Integer.class, etc)
    
  2. 您可以构造一个数组并将该数组作为单个参数传递

    Class<?>[] classes = new Class<?>[3];
    classes[0] = String.class;
    ...
    Constructor<?> ctor = getDeclaredConstructor(classes);
    
  3. 要在不事先知道它有多少参数或类型是什么的情况下找到构造函数,您可以使用第二种方法 - 构造一个描述您要查找的参数列表的数组,然后使用该数组作为参数调用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);