那么,我有以下场景:
-
我有一个名为
AIInstruction
的类,它实际上不是由它自己实例化的,而是通过子类实例化的。 -
我有一堆类称为
AIInstruction_***
扩展AIInstruction
。这些类中的每一个都有一个构造函数,但所需参数的类型和数量不同。 -
我有一个管理器类它看起来像这样:
public class AIControls { public static HashMap<String, Class<? extends AIInstruction>> INSTRUCTION_DICTIONARY = new HashMap<String, Class<? extends AIInstruction>>(); static { INSTRUCTION_DICTIONARY.put("rotateTowards", AIInstruction_rotateTowards.class); INSTRUCTION_DICTIONARY.put("moveToPoint", AIInstruction_moveToPoint.class); // (etc...) } LinkedList<AIInstruction> _instruction_queue; public AIControls() { _instruction_queue = new LinkedList<AIInstruction>(); } public void addInstruction(String instruction, Object... params) { /* ??? */ } }
我想在addInstruction
中做的是创建一个类的实例,其在INSTRUCTION_DICTIONARY
中的键是instruction
,并将这个新实例添加到_instruction_queue
LinkedList中。params
变量是指instruction
所引用的类的构造方法所需要的参数。
根据我的研究,我发现反思是很好的方法。我以前从未使用过反射,所以我想我可能遗漏了一两件事。这是我所能做到的:
public void addInstruction(String instruction, Object... params)
{
Class<?> the_class = INSTRUCTION_DICTIONARY.get(instruction);
Constructor<?> the_constructor = the_class.getConstructor(/* ??? */);
AIInstruction new_instruction = the_constructor.newInstance(params);
_instruction_queue.add(new_instruction);
}
然而,这段代码基本上有两个问题:
我不知道该把
/* ??? */
放在哪里。我想我应该把参数的类型,但他们可以是任何东西,因为每个AIInstruction
子类有非常不同的构造函数(在类型和参数的数量)。我不确定
newInstance
调用是否会工作,因为params数组包含Object
类型的实例。
任何帮助都是非常感激的,谢谢!
您可以使用Class.getConstructors()
获取类中所有构造函数的数组。假设您只有一个构造函数,您可以简单地检查大小以防止OOB异常,并将[0]保存为您的构造函数。
看起来你不需要知道构造函数接受什么类型的参数,但如果你知道,你总是可以使用Constructor.getParameterTypes()
。如前所述,这也可以用于在多个构造函数之间进行识别。