说我有一个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
}
答案 0 :(得分:0)
像车辆一样制造一个普通的超级班级,并从该班级派出公共汽车和出租车。
然后你只需要List<Vehicle> types = Arrays.asList(Taxi.class, Bus.class);