java - 反射 - 使用未知数量的构造函数参数获取未知类的新实例

标签 java oop reflection

首先,我是 Reflection 的新手。我一直在从事一个大型项目,我需要在某些部分使用反射(是的,我绝对需要它)。所以我想,我应该创建一个 Reflection Helper 类,它能够在我的项目中创建具有任意数量参数的任何类的新实例。

作为我的问题的一个例子:通常(据我所知)创建一个类的实例,该类的构造函数中有 2 个字符串作为参数;

Class.getConstructor(String.class, String.class).newInstance("Arg_1", "Args_2");

会完成这项工作。但是,在我的例子中,我需要一种方法,该方法适用于具有任何构造函数的任何类。所以我创建了这些方法,但它似乎不起作用,我不断收到 NoSuchMethodException。我需要帮助才能让它发挥作用。

private static String packagePrefix = "com.***";

public static Class<?> getClass(String className) throws ClassNotFoundException {
    return Class.forName(packagePrefix + "." + className);
}

public static Object getClassInstance(String className, Object... args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
    Class<?>[] cArgs = new Class[args.length];
    for (int i = 0; i < args.length; i++) {
        cArgs[i] = args[i].getClass();
    }
    return getClass(className).getConstructor(cArgs).newInstance(args);
}

最佳答案

通常,您不能“使用任意数量的参数创建任何类的新实例”。如果没有这样的构造函数,那么您将无法调用它。

接下来,Class.getConstructor 找到具有给定形式参数类型的构造函数,而不是赋值兼容类型。因此,如果您有 Foo(Number),您将找不到带有 Foo.class.getConstructor(Long.class) 的构造函数。您必须遍历 Class.getConstructors 并搜索具有参数类型与赋值兼容的参数类型的构造函数。

幸运的是,这已经完成了一千次了。参见 ConstructorUtils.invokeConstructor来自 Commons BeanUtils , 例如。实现绝非易事。

关于java - 反射 - 使用未知数量的构造函数参数获取未知类的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45887927/

相关文章:

java - 如何将后端模块类导入android studio中的应用程序模块

c# - 这种聚合设计模式有名称吗?

r - 为什么 R 在引用类对象上使用属性时反复无常?

java - Clojure 中函数的类型提示

java - PC 故障后我的 MainActivity 文件是否损坏?

java - easymock 抛出断言错误,期望操作验证失败

Java 类用小写字母命名

c++ - 我可以从派生类中排除基类成员吗?

java - 如何检索 Java 反射的子类?

java - 获取未知类字段的值