java泛型反映调用方法体内类型引用问题
2014-08-25 07:31
441 查看
自个在写自动化测验工具有关thrift效劳自动化测验遇到的疑问
首先给大家看一段代码
Java代码 保藏代码
public static void test(Listlist){
System.out.println(list.get(0));
System.out.println(list.get(0) + 123);
System.out.println(list.get(0).getClass());
}
public static void bugTest1(){澳洲保健品http://www.eget.com.au
国医一号http://www.tdhzp.com
号码大全http://www.haomad.com
临沂购http://www.shoudashou.com
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());
}
首先给大家看一段代码
Java代码 保藏代码
public static void test(Listlist){
System.out.println(list.get(0));
System.out.println(list.get(0) + 123);
System.out.println(list.get(0).getClass());
}
public static void bugTest1(){澳洲保健品http://www.eget.com.au
国医一号http://www.tdhzp.com
号码大全http://www.haomad.com
临沂购http://www.shoudashou.com
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());
}
相关文章推荐
- 问题(怎样在dephi中引用.net中定义的类.方法参数,参数类型为XMLdocument?我要调用此方法并把实例花的xmldocument类型的变量作为参数给它。)
- 关于实现引用类型数组去调用引用类的方法的问题的解决
- 遇到动态调用Parameters .AddWithValue()参数类型问题的解决方法
- CCLayer 在 init 中调用 schedual 方法后引用计数混乱的问题
- 类型:JQuery;问题:ajax调用ashx文件;结果:ashx文件怎么获取$.ajax()方法发送的json数据
- java 引用类型作为方法参数使用问题
- 关于java基础类型与引用类型内存存储问题,以及string.intern()方法(String两种创建方式的区别)
- Velocity Toolbox类的方法无法调用时引发的一个类型转换问题
- Java泛型 类型擦除在继承中引入的问题及编译器的解决方法
- 类型:Ajax;问题:ajax调用ashx参数获取不到;结果:ashx文件获取$.ajax()方法发送的数据
- JAVA泛型-类型擦除太恶心,但项目中大量使用,以及类型擦除引起的问题及解决方法
- (java)对象引用向上转型后,无法调用子类独有的方法和属性问题
- C++关于参数为const引用类型的函数调用参数成员函数的一个问题
- Flex错误1061:调用可能未定义的方法 (通过 static 类型 Class 引用)
- 调用可能未定义的方法 attachVideo (通过 static 类型 flash.media:Video 引用)解决办法
- 反射技术动态调用方法中的引用类型参数传递 (转)
- 对象的引用调用private类型函数的问题
- 引用类型和值类型在方法调用中的异同?
- 《对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们》的问题的解决方法
- 被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法