码迷,mamicode.com
首页 > 编程语言 > 详细

夯实JAVA基本之二 —— 反射(2):泛型相关周边信息获取

时间:2015-11-28 18:32:52      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

前言:坚信自己坚信的,坚持自己坚持的,永远选择相信自己。

在上篇中,我们简单给大家讲解了如何利用反射来获取普通类型的类的使用,今天给大家讲解下,有关如何使用反射来获取泛型中的信息。提前提个醒,本篇文章内容稍难,大家可能需要多看几篇。
这篇文章将大量用到泛型的知识,如果对泛型声明及填充不太了解的同学,请先看完《夯实JAVA基本之一 —— 泛型详解系列》

一、获取泛型超类和接口的相信信息

在这部分内容中,我们将讲述如何获取泛型的超类和接口,把上篇中遗留下来的两个函数先讲完。

1、获取泛型超类相信信息

上篇中,我们讲了,要获取泛型类型的超类,要用到一个函数:

//针对泛型父类而设计
public Type getGenericSuperclass();
下面我们就先看看这个函数怎么用,我们依然以上篇中的Point类以及它的派生类PointImpl为例:
//Point泛型类的实现
public class Point<T> {
    private T x,y;

    public T getX() {
        return x;
    }

    public void setX(T x) {
        this.x = x;
    }

    public T getY() {
        return y;
    }

    public void setY(T y) {
        this.y = y;
    }

}
//PointImpl类的实现
public class PointImpl extends Point<Integer> {
}
从上面的代码中,我们可以看到,Point类是一个泛型类,具有一个泛型变量T;而PointImpl派生自Point并且在派生时,将Point进行填充为Point,即将Point中的泛型变量填充为Integer类型。
下面, 我们将通过反射获取PointImpl的父类的类型,以及PointImpl的填充类型
我们在没看代码之前,我们先看看结果,我们知道PointImpl的父类类型是Point,而PointImpl的填充类型应该是Integer.
然后我们再看看代码:
Class<?> clazz = PointImpl.class;
Type type = clazz.getGenericSuperclass();
if (type instanceof ParameterizedType) {
    ParameterizedType parameterizedType = (ParameterizedType) type;
    //返回表示此类型实际类型参数的 Type 对象的数组
    Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
    for (Type parameterArgType : actualTypeArguments) {
        Class parameterArgClass = (Class) parameterArgType;
        Log.d(TAG,"填充类型为:" + parameterArgClass.getName());
    }

    //返回 Type 对象,表示声明此类型的类或接口。
    Type type1 = parameterizedType.getRawType();
    Class class22 = (Class) type1;
    Log.d(TAG,"PointImpl的父类类型为:"+class22.getName());

}
相信上面这段代码,大家肯定是很不懂的。。。。因为确实狠复杂,不管那些,我们先看看结果:
技术分享























夯实JAVA基本之二 —— 反射(2):泛型相关周边信息获取

标签:

原文地址:http://blog.csdn.net/harvic880925/article/details/50085595

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!