繁体   English   中英

反射 - 获取具有未知数量的构造函数参数的未知类的新实例

[英]Reflection - Getting New Instance of unknown classes with unknown number of constructor parameters

首先,我是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并搜索具有参数类型赋值兼容类型的参数的构造函数。

幸运的是,这已经完成了一千次。 例如,请参阅Commons BeanUtils中的 ConstructorUtils.invokeConstructor 实施远非微不足道。

在你的评论中,你说你的课有4个参数

Skill(Monster m, Integer procChance, Integer duration, Integer severity)

但是你试图仅使用3个参数反射创建它:

Skill skill = (Skill) ReflectionHelper.getClassInstance(skillPackagePrefix + skillType.getName(), monster, procChance, params);

即使认为param是一个包含2个整数的数组(正如你所评论的那样),它将被Java视为数组参数,并且不会被合并到Object... args varargs中。 上面的代码仅适用于以下构造函数:

Skill(Monster m, Integer procChance, Integer[] params)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM