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

自个在写自动化测验工具有关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());
}

时间: 2024-07-31 14:30:34

java泛型反映调用方法体内类型引用问题的相关文章

java泛型之桥方法

感觉泛型中的桥方法挺难理解的,写篇笔记记录一下(具体是core java第536页,我的理解可能会有偏差). 如下面的两段代码: public class Pair<T> { private T first; private T second; public Pair() { first = null; second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } pu

Java泛型函数的运行时类型检查的问题

在一个数据持久化处理中定义了数据保存和读取的 泛型函数的,但是在运行时出现类型转换错误,类型不匹配,出错的位置不是load方法,而是在调用load方法之后,得到了列表数据,对列表数据进行使用时出现的.结果列表里面的元素实际是A类型,调用load方法传递的是B类型的class,但是仍然load成功. 很是疑惑,最终修改代码调试后,解决问题. import android.content.Context; import android.text.TextUtils; import java.io.F

一句话,讲清楚java泛型的本质(非类型擦除)

背景 昨天,在逛论坛时遇到个这么个问题,上代码: public class GenericTest { //方法一 public static <T extends Comparable<T>> List<T> sort(List<T> list) { return Arrays.asList(list.toArray((T[]) new Comparable[list.size()])); } //方法二 public static <T exten

一文讲解Java泛型的本质(非类型擦除)

背景 昨天,在逛论坛时遇到个这么个问题,上代码: public class GenericTest { //方法一 public static <T extends Comparable<T>> List<T> sort(List<T> list) { return Arrays.asList(list.toArray((T[]) new Comparable[list.size()])); } //方法二 public static <T exten

xml中定义个TextView控件及java代码中调用方法。

<TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="@string/hello_world"         android:id="@+id/myTextView" /> TextView myTextView = (Text

java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 参考:java核心技术 一.Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首要前提是理解类型擦出(type erasure). Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型信息的.使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉.这个过程就称为类型

泛型的内部原理:类型擦除以及类型擦除带来的问题

参考:java核心技术 一.Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首要前提是理解类型擦出(type erasure). Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型信息的.使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉.这个过程就称为类型擦除. 如在代码中定义的List<object>和List<

java基础-四种方法引用

实例 直接三角形,通过两边算第三边,目的是为了如何使用这几种方法引用.代码中多有些不合适,尽情原谅. 静态方法引用 接口的参数列表与类中的具体实现方法的参数列表一样,返回值一致. 调用 //静态引用 IStaticSide staticSide = Five::getStaticSize; staticSide.getStaticSize(3, 6); 类中定义 //静态引用 public static double getStaticSize(double s,double s2) { ret

关于Java泛型深入理解小总结

1.何为泛型 首先泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,原理类似如下代码 int pattern; //声明一个变量未赋值,pattern可以看作是泛型 pattern = 4; pattern = 5;//4和5就可以看作是String和Integer 泛型的具体形式见泛型类.泛型方法 *泛型类形式如下 class Test<T> { private T t; Test(T t) { this.t