我知道已经有很多关于反射和原始类型的问题,但我并没有真正得到我搜索的确切信息。我的问题如下:我想(通过反射)完全动态地调用方法,这意味着即使我不完全知道参数的类型,我也想调用它们。
public Object invoke(Object objectContainingMethod,String methodName, Object...params) {
Object result = null;
int length = params.length;
Class<?>[] paramTypes = new Class<?>[length];
for(int i=0; i<length; i++) {
paramTypes[i] = params[i].getClass();
}
try {
Method method = objectContainingMethod.getClass().getMethod(methodName, paramTypes);
// not hard coded like getMethod(methodName, String.class, int.class, double.class);
result = method.invoke(objectContainingMethod, params);
} catch (NoSuchMethodException | SecurityException |
IllegalAccessException | IllegalArgumentException |
InvocationTargetException e) {
e.printStackTrace();
}
return result;
}
(还没有优化任何东西,所以请不要讨厌^^)问题是,该方法的参数需要在 Object 中转换但是当我这样做时,如果它是原始类型,您将无法真正检测到,因为的自动拳击。当我尝试使用int参数从类String调用方法“charAt”时会发生这种情况:
String instance = "hello";
Object result = invoke(instance,"charAt",0);
这显然导致:
java.lang.NoSuchMethodException: java.lang.String.charAt(java.lang.Integer)
at java.lang.Class.getMethod(Unknown Source)...
由于自动装箱,他搜索了Integer而不是int 。那么我在这里尝试做的事情有解决办法吗?我知道如何检测原始类型,但不是当它们被自动装箱到它们的包装器类型时。任何帮助是极大的赞赏。