我有一个方法,它有一个输入列表,每个输入值我必须将其转换为所需的类型。(实际上这个列表有"一些"形式的参数值,我应该将其转换为所需的类型,所需的类型是方法所需的类型,这是用于通过反射进行 api 调用(
我写了这样的代码:
Type[] argTypes = method.getGenericParameterTypes();
List<Object> acutalValues = // List of actual values from method input.
// Resultant list of arguments which will holds casted values.
List<Object> arguments = new ArrayList<Object>(argTypes.length);
for (int i = 0; i < argTypes.length; i++) {
Class<?> requiredClassTYpe = (Class<?>) argTypes[i]; // argTypes[1] =java.util.List<java.lang.String> fails..
// cast the actual value to the required type. Required type is requiredClassType
arguments.add(castToRequiredType(requiredClassTYpe, actualValues.get(i)));
}
异常消息如下所示:
ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl (id=77) to java.lang.Class
现在,如果我将第一行更改为
Type[] argTypes = method.getParameterTypes()
然后它传递任何想法为什么它会这样发生?
正如JavaDoc method.getGenericParameterTypes()
中所述:
返回
Type
表示形式 参数类型。
如果形式参数类型是参数化类型, 为其返回的 Type 对象必须准确反映 源代码中使用的实际类型参数。
因此,如果您的方法声明如下所示:
public void myMethod(String string, List<String> list) { ... }
argTypes[0]
将包含Class
实例(即 Class<? extends String>
(,但argTypes[1]
将包含 java.lang.reflect.ParameterizedType
的实例。您可以使用getActualTypeArguments()
方法获取有关ParameterizedType
的实际类型参数的信息。上面描述的情况 I 的示例:
Type[] listTypeArgs = ((ParameterizedType) argTypes[1]).getActualTypeArguments()
// listTypeArgs.length == 1 as List<String> have one type argument
// listTypeArgs[0] now contains instance of Class<? extends String>
由于方法参数是参数化集合类型,因此getGenericParameterTypes
返回ParameterizedType
,而不是Type
。 要得到实际的类型,首先需要检查argTypes
的每个元素是否是ParameterizedType
的一个实例,以及是否调用ParameterizedType.getActualTypeArguments()
。
话虽如此,我无法判断您的代码试图做什么。 您的结果对象仍然是一个List<Object>
,因此当您从列表中获取元素时,您仍然必须将元素转换为正确的类型。 在将元素存储在列表中之前强制转换元素不会完成任何操作。
Type[] argTypes = method.getParamterTypes()
我相信您的方法调用中缺少"e",应该getParameterTypes()