gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:15:42 28 4
gpt4 key购买 nike

所以,我有以下场景:

  • 我有一个名为 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 链表的新实例。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()。如前所述,如果是这种情况,这也可用于在多个构造函数之间进行识别。

关于java - 使用 HashMap 和反射来调用具有可变参数类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25226752/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com