我知道有很多关于反射和原始类型的问题,但我并没有真正得到我搜索到的确切信息。 我的问题如下: 我想调用完全动态的方法(通过反射),这意味着我想调用它们,即使我不知道参数的类型。
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 调用Method“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)...
由于自动装箱,他搜索整数而不是 int 。 那么我正在尝试做什么呢?我知道如何检测原始类型,但是当它们被自动装箱到它们的包装类型时却不知道。非常感谢任何帮助。
答案 0 :(得分:4)
您必须将Class数组作为参数传递给自定义invoke
方法,该方法具有在方法签名中搜索的显式类型,而不是尝试直接从参数中确定类型。这正是Class.getMethod(String, Class[])
需要类型而不是从参数推断的原因。
将您的签名更改为此类似的内容。直接使用类数组,而不是推断类型。或者你可以使用Collection而不是数组,这仅仅是例如。
public Object invoke(Object objectContainingMethod,String methodName, Class<?>[] types, Object...params)