在java

时间:2015-11-21 16:00:13

标签: java class reflection

所以,标题就是一切。当我尝试使用.newInstance在Object数组中传递参数时,我收到一个错误:

  

java.lang.IllegalArgumentException:参数类型不匹配       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)       at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)       at java.lang.reflect.Constructor.newInstance(Unknown Source)       at me.voxed.textrpg.RoomCreator.setNorth(RoomCreator.java:44)       在me.voxed.textrpg.Game。(Game.java:89)       在me.voxed.textrpg.Program.main(Program.java:6)

这是我正在使用的功能:

    public void setNorth(String block, String... args){
    try {
        Object[] argsObj = args;
        Class<? extends Block> clazz = (Class<? extends Block>) (GameRegistry.getBlock(block));
        _north = clazz.asSubclass(Block.class).getConstructor(Object[].class).newInstance(argsObj);
    } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
            | NoSuchMethodException | SecurityException e) {
        e.printStackTrace();
    }
}

clazz是这堂课:

public class BlockNPCSpawnBars extends BlockNPC {

public BlockNPCSpawnBars(Object[] args) {
    super(args);
}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

newInstance采用可变参数。当你传递一个数组时,它会转换为varargs调用,就好像该数组中的每个元素都是构造函数的一个单独的参数一样。

这通常解决如下:

...newInstance((Object) argsObj);

这将确保数组作为单数参数传递,就像您的实际构造函数所期望的那样。