前言:坚信自己坚信的,坚持自己坚持的,永远选择相信自己。
在上篇中,我们简单给大家讲解了如何利用反射来获取普通类型的类的使用,今天给大家讲解下,有关如何使用反射来获取泛型中的信息。提前提个醒,本篇文章内容稍难,大家可能需要多看几篇。
这篇文章将大量用到泛型的知识,如果对泛型声明及填充不太了解的同学,请先看完《夯实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()); }
相信上面这段代码,大家肯定是很不懂的。。。。因为确实狠复杂,不管那些,我们先看看结果:
时间: 2024-11-05 20:21:29