尝试调用方法时参数类型不匹配

时间:2015-04-13 14:23:02

标签: java reflection invoke

说我有一个parameters数组:

Object[] parameters;

我还有一个types列表,用于存储方法的参数类型。

List<Class<?>> types = Arrays.asList(Taxi.class, Bus.class);

接下来实例化数组:

parameters = new Object[types.size()];

现在,我使用parameters列表中的给定类型填充types数组:

int index = 0;
for (Class<?> type : types) {
    if (Taxi.class.isAssignableFrom(type)) {
        parameters[index] = new Taxi();
    } else if (Bus.class.isAssignableFrom(type)) {
        parameters[index] = new Bus();
    } 
    index ++;
}

现在我尝试调用与types列表具有完全相同参数的方法:

someMethod.invoke(someObject, parameters);

someMethod具有以下签名:

public void someMethod(Taxi taxi, Bus bus);

Java给了我一个 IllegalArgumentException:参数类型不匹配。我明白为什么会发生这种情况,因为parameters是一个Object数组;有什么变通方法吗?也许喜欢演员?但是如何?

请注意:1)types列表中的对象可能没有共同的超类。 2)我知道不直接调用方法但使用反射这样做很奇怪;这是因为我正在尝试实现类似事件的系统,这需要&#34;填写&#34;方法参数动态。 3)参数类型(types列表)已在编译之前确定。

获取方法的方式:

// Collect methods
Set<Method> methods;
Method[] publicMethods = someClass.getClass().getMethods();
methods = new HashSet<>(publicMethods.length, Float.MAX_VALUE);
Collections.addAll(methods, publicMethods);
Collections.addAll(methods, listener.getClass().getDeclaredMethods());
// Find annotated methods
for (final Method method : methods) {
    method.setAccessible(true);
    // Code from above
}

1 个答案:

答案 0 :(得分:0)

像车辆一样制造一个普通的超级班级,并从该班级派出公共汽车和出租车。

然后你只需要List<Vehicle> types = Arrays.asList(Taxi.class, Bus.class);