jav*_*thu 4 java generics reflection list classcastexception
我有一个方法,它有一个输入列表和每个输入值我必须将其转换为所需的类型.(实际上这个列表有"some"形式的参数值,我应该转换成所需类型,所需类型是方法所需的类型,这是通过反射调用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)));
}
Run Code Online (Sandbox Code Playgroud)
异常消息是这样的:
ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl (id=77) to java.lang.Class
Run Code Online (Sandbox Code Playgroud)
现在,如果我将第一行更改为
Type[] argTypes = method.getParameterTypes()
Run Code Online (Sandbox Code Playgroud)
然后它传递任何想法为什么会这样发生?
因为如method.getGenericParameterTypes()JavaDoc中所述:
返回
Type表示形式参数类型的对象数组...
如果形式参数类型是参数化类型,则为其返回的Type对象必须准确反映源代码中使用的实际类型参数.
因此,如果您的方法声明如下:
public void myMethod(String string, List<String> list) { ... }
Run Code Online (Sandbox Code Playgroud)
argTypes[0]将包含Class(ie Class<? extends String>)的argTypes[1]实例,但将包含实例java.lang.reflect.ParameterizedType.您可以获取有关ParameterizedType使用getActualTypeArguments()方法的实际类型参数的信息.上述案例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>
Run Code Online (Sandbox Code Playgroud)
小智 0
Type[] argTypes = method.getParamterTypes()
Run Code Online (Sandbox Code Playgroud)
我相信您在方法调用中缺少“e”,应该是getParameterTypes()
| 归档时间: |
|
| 查看次数: |
9380 次 |
| 最近记录: |