java获取泛型的实际类型

这是一个困扰了我好久的问题,在我写的android请求框架总结(二)中写到过利用框架自动解析json数据,代码如下

Object o;
if (result.charAt(0) == ‘{‘) {
//解析对象
     o = new Gson().fromJson(result, clazz);
} else {
      //这个方法是在stackoverflow中找到的可将json转换为list,普通的通过type去解析是不行的
      o = new Gson().fromJson(result, com.google.gson.internal.$Gson$Types.newParameterizedTypeWithOwner(null, ArrayList.class, clazz));
}
listener.success(o);

返回的对象也只能是Object类型,具体用的时候还需要做一下强转

HttpClient.postRequest(this, "http://www.baidu.com", TestBean.class, map, new OnResponseListener() {
            @Override
            public void success(Object result) {
                //如果result为对象
                TestBean testBean = ((TestBean) result);
                //如果result为list
                List<TestBean> testBeans = (ArrayList<TestBean>) result;
            }

            @Override
            public void failure(String errorMessage) {
                System.out.println("errorMessage = " + errorMessage);
            }
        });

其实当时有想过用泛型来做,但就是不知如何获取泛型的实际类型,虽然已经比较简洁了,但是感觉还不太彻底,如果直接能得到对象就更好了,终于,皇天不负有心人,有大神解决了这个问题,前两天比较火的hongyang大神的OkHttpUtils的一篇文章关于json自动解析的这一块对我的帮助比较大,当然,我也顺便吐槽下,OkHttpUtils的封装并不能帮助大家更好的理解OkHttp,OkHttp的设计非常优秀,但是经过这么一封装,又和之前看到的快速开发框架无异,希望看的人也能多思考,可以借鉴其中优秀的地方,同时也要能看到不足的一面,不要盲目跟风。

看代码:

 public static abstract class ResultCallback<T>
    {
        Type mType;

        public ResultCallback()
        {
            mType = getSuperclassTypeParameter(getClass());
        }

        /**
         * 得到泛型T的实际Type
         */
        static Type getSuperclassTypeParameter(Class<?> subclass)
        {
            Type superclass = subclass.getGenericSuperclass();
            if (superclass instanceof Class)
            {
                throw new RuntimeException("Missing type parameter.");
            }
            ParameterizedType parameterized = (ParameterizedType) superclass;
            return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
        }

    }

使用

callBack.onSuccess(new Gson().fromJson(result, callBack.type));

这样就可以直接返回结果,如下:

//也支持List<Person>直接返回
 HttpClient.post(response, new ResultCallBack<TestBean>() {
            @Override public void onSuccess(TestBean result) {
            }
        });

这种方式可以简化不少的代码,但是Android Studio不是很给力,通常提示是这样的

完了还要移动鼠标手动去修改代码,比原来做一下强转也没有方便多少,但还是有办法的,还记得android Studio提供的活动模板(live template)的功能吗?Android Studio 使用技巧(三),这里来体验下它的强大之处,效果演示:

还有一点不明我测试了下

GsonTypes.canonicalize(parameterized.getActualTypeArguments()[0]); 和

parameterized.getActualTypeArguments()[0]

打印的结果是一样的,去掉外面的一层包裹也能正常运行

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 10:50:44

java获取泛型的实际类型的相关文章

Java获取泛型的类型Class

今天搭建框架的时候,要获取泛型<T>的Class具体例子: @EnableTransactionManagement @Transactional @Repository public class BasicDAO<T> extends HibernateDaoSupport { //实体类 private T entity; private Class<T> entityClass; public BasicDAO() { //通过反射机制获取泛型的类类型 entit

Gson通过借助TypeToken获取泛型参数的类型的方法(转)

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型). 但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手. class Foo<T>

Gson通过借助TypeToken获取泛型参数的类型的方法

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型). 但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手. class Foo<T>

Java获取泛型的Class对象

工作中瞄到的,在此收集了 [java] view plain copy public class RawDao<T> { protected Class<T> clazz; @SuppressWarnings("unchecked") public RawDao() { @SuppressWarnings("rawtypes") Class clazz = getClass(); while (clazz != Object.class) {

Java获取泛型 Class

//得到泛型的Class private Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 原文地址:https://www.cnblogs.com/sdu-Jumper/p/12031997.html

获取泛型的class 反射

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型). 但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手. ? 1 2 3 4 5

利用ParameterizedType获取泛型参数类型

//利用ParameterizedType获取java泛型的参数类型 public class Demo { public static void main(String[] args) { classTest(); interfaceTest(); } private static void classTest() { MySuperClass<Student, String> mySuperClass = new MySuperClass<Student, String>() 

java 反射和泛型-反射来获取泛型信息

通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class<?> type = f.getType();//获得字段的类型 但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>; 为了获得指定Field的泛型类型,我们采用: Type gType = f.getG

Java中泛型 类型擦除

转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下面一个列子,代码如下: public class Foo { public void listMethod(List<String> stringList){ } public void listMethod(List<Integer> intList) {