java 泛型 引用_java泛型反映调用方法体内类型引用问题

String json = "[50004172,926513792]";

for(Method m :ThriftGenUtils.class.getMethods()){

if("test".equals(m.getName())){

for(Class pClass : m.getParameterTypes()){

Object argCasted = Json.strToObj(json, pClass);

try {

m.invoke(new ThriftGenUtils(),argCasted);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

}

}

}

运转bugTest1

疑问:

1 argCasted详细类型为List,其间的泛型详细类型为何类型?为何?

2 invoke是不是能成功?

3 若invoke成功了,list的泛型详细类型是啥类型?test是不是能够成功运转?若不能成功运转,到哪一行犯错?报啥过错?为何?

答案:

1 Integer,m.getParameterTypes()获取到的泛型类型是不包括详细类型的,也即是Json.strToOb调用的时分pClass仅仅传了List,Json变换的时分只知道是数据类型,默许转成Integer,浮点数转为Double。

2 是

3 Integer,不能成功,到219行报类型变换反常Integer不能变换为Long类型,原因是泛型类型擦除。(泛型类型擦除:http://blog.csdn.net/caihaijiang/article/details/6403349 )

当前的解决方案为获取到泛型类型及详细类型,经过ObjectMapper.getTypeFactory().constructParametricType(clazz,genericClazzes)来获取javaType再来变换成Object目标

改造后,完成的有关代码如下

Java代码 保藏代码

Method method = null;

ListargList = new ArrayList<>();

for (Method m : clientClazz.getMethods()){

if(!methodName.equals(m.getName())){continue;}

method = m;

Type[] types = m.getGenericParameterTypes();

Class[] classes = m.getParameterTypes();

int i = 0;

for ( Type c: types) {

int index = i++;

String arg = args[index];

if(!(c instanceof ParameterizedType)){

String jsonStr = Json.ObjToStr(arg);

argList.add(Json.strToObj(jsonStr,classes[index]));

continue;

}

ParameterizedType pt = (ParameterizedType) c;

ObjectMapper mapper = new ObjectMapper();

Class[] genericClazzes = new Class[pt.getActualTypeArguments().length];

int j = 0;

for(Type type : pt.getActualTypeArguments()){

genericClazzes[j ++] = (Class) type;

}

JavaType javaType = mapper.getTypeFactory().constructParametricType(classes[index],genericClazzes);

Object argCasted = mapper.readValue(arg,javaType);

argList.add(argCasted);

}

break;

}

if ( method != null){

res = method.invoke(obj,argList.toArray());

}


版权声明:本文为weixin_39765057原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。