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

Java 反射-获取具有未知数量构造函数参数的未知类的新实例,java,oop,reflection,Java,Oop,Reflection,首先,我是一个新的思考。我一直在从事一个大型项目,我需要在某些部分使用反射(是的,我肯定需要它)。所以我想,我应该创建一个反射帮助器类,它能够在我的项目中创建具有任意数量参数的任何类的新实例 作为我问题的一个例子:通常(据我所知),创建一个类的实例,该类的构造函数中有两个字符串作为参数 Class.getConstructor(String.class, String.class).newInstance("Arg_1", "Args_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);
}
私有静态字符串packagePrefix=“com.**”;
公共静态类getClass(字符串className)引发ClassNotFoundException{
返回Class.forName(packagePrefix+“+类名);
}
公共静态对象getClassInstance(字符串类名称、对象…参数)抛出实例化异常、IllegaAccessException、ClassNotFoundException、IllegalArgumentException、InvocationTargetException、NoSuchMethodException、SecurityException{
类[]cArgs=新类[args.length];
对于(int i=0;i
一般来说,您不能“使用任何数量的参数创建任何类的新实例”。如果没有这样的构造函数,那么您将无法调用它

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


幸运的是,这已经做了一千次了。例如,从中看到。实现绝非微不足道。

在您的评论中,您是说您的类具有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也会将其视为数组参数,并且不会将其合并到
对象中。。。args
varargs。上述代码仅适用于以下构造函数:

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

什么
对象。。。args
是否使用?
Skill Skill=(Skill)ReflectionHelper.getClassInstance(skillPackagePrefix+skillType.getName(),monster,procChance,params)调用
getClassInstance
方法
其中,相关技能类的构造函数为->
(怪物me、整数概率、整数持续时间、整数严重性)
此外,params有2个整数,一个用于持续时间,另一个用于严重性。您可以使用
类和
类[]
消除所有被抑制的警告。不应使用原始类型。为对象传递单个对象数组。。。args只是为我工作。这样调用它:
ReflectionHelper.getClassInstance(skillPackagePrefix+skillType.getName(),reflectionParams)和方法构造函数:
getClassInstance(字符串className,Object…args)
有效。您不能将vara args和数组混合在一起,并期望它们像最初一样合并。您确实是对的。getConstructor方法找不到正确的构造函数,因为运行时类名不同。我采用手动方式,迭代构造函数,并通过类#isAssignableFrom方法验证参数。现在一切似乎都好了。谢谢