使用HashMap和反射调用具有可变参数类型的方法



那么,我有以下场景:

  • 我有一个名为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);
}
然而,这段代码基本上有两个问题:
  1. 我不知道该把/* ??? */放在哪里。我想我应该把参数的类型,但他们可以是任何东西,因为每个AIInstruction子类有非常不同的构造函数(在类型和参数的数量)。

  2. 我不确定newInstance调用是否会工作,因为params数组包含Object类型的实例。

任何帮助都是非常感激的,谢谢!

您可以使用Class.getConstructors()获取类中所有构造函数的数组。假设您只有一个构造函数,您可以简单地检查大小以防止OOB异常,并将[0]保存为您的构造函数。

看起来你不需要知道构造函数接受什么类型的参数,但如果你知道,你总是可以使用Constructor.getParameterTypes()。如前所述,这也可以用于在多个构造函数之间进行识别。

相关内容

  • 没有找到相关文章

最新更新