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

Java 使用HashMap和反射调用具有变量参数类型的方法,java,reflection,types,variadic-functions,Java,Reflection,Types,Variadic Functions,因此,我有以下场景: 我有一个名为AIInstruction的类,它实际上并不意味着要自己实例化,而是通过一个子类来实例化 我有一组名为AIInstruction.***的类,它们扩展了AIInstruction。这些类中的每一个都有一个构造函数,但它们所需的参数类型和数量有所不同 我有一个经理类,看起来像这样: public class AIControls { public static HashMap<String, Class<? extends AIInstruc

因此,我有以下场景:

  • 我有一个名为
    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)
        {
            /*
            ???
            */
        }
    }
    
    但是,该代码基本上有两个问题:

  • 我不确定用什么来代替
    /**/。我想我应该输入参数的类型,但它们可以是任何类型,因为每个
    AIInstruction
    子类都有非常不同的构造函数(在参数的类型和数量上)

  • 我也不确定
    newInstance
    调用是否有效,因为params数组包含
    Object
    类型的实例


  • 非常感谢您的帮助,谢谢

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

    看起来您不需要知道构造函数采用什么类型的参数,但如果您知道,您可以始终使用
    constructor.getParameterTypes()
    。如前所述,如果是这样的话,这也可以用来识别多个构造函数

    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);
    }