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

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

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

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

夯实JAVA基本之二 —— 反射(3):类内部信息获取

前言:人总会疲惫,当感觉累的时候,再坚持一下就好,再坚持一下. 上两篇文章中,给大家讲了,有关类周边信息的获取方法,这篇文章中我们将深入到类的内部,看看类的构造函数,内部变量,函数等信息的获取方法.相比而言,这篇更重要. 一.构造函数相关获取 1.获取构造函数 要获取类的构造函数,有下面几种方法: //获取public类型的构造函数 Constructor<?>[] getConstructors(); Constructor<T> getConstructor(Class<

利用反射,泛型,静态方法快速获取表单值到Model

在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: News news = new News(); news.Id = int.Parse(Request.Form["Id"]); news.Category = int.Parse(Request.Form["Category"]); news.Title = Request.Form["Title"]; news.CreateTime = DateTime.Par

java反射获得泛型参数getGenericSuperclass():获取到父类泛型的类型

public class Person<T> { } import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Student extends Person<Student> { public static void main(String[] args) { Student st=new Student(); Class clazz=st.getClass();

夯实Java基础(二十三)——Java8新特征之Optional类

一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null值判断(null的防御性检查),避免null导致的NPE(NullPointerException). 我们来看一段代码: public static String getGender(Student student) { if(null == student) { return "Unkown&q

夯实Java基础(十九)——泛型

原文地址:https://www.cnblogs.com/tang-hao-/p/11347124.html

3DsMax导出插件编写(二)——常规SDK方法进行信息获取和保存文件

之前已经把配置vs和maxSdk的方法介绍过了,如果不懂怎样配置的朋友请参考: http://liweizhaolili.blog.163.com/blog/static/162307442013117731953/ 下面来介绍一下导出插件的具体写法.不过这不是一个容易说的很详细的问题.因为我们要写导出插件,通常都是因为想根据自己想要的信息来导出,所以就算我把我整个工程都公开,意义也不大的,因为那是根据我自己需要的数据写的业务,估计不太可能和你想要的一样的.所以我也只能简单的说明一些几个关键获取

夯实Java基础系列目录

学习Java语言也有很长一段时间了,但是之前只是学习了Java的基础部分,对于什么IO流.多线程之类的只学习了一点,并没有过多的去学习,所以随着后面学习的深入,发现没有这部分知识更加的重要,所以现在我又重新来复习一遍Java基础,努力打好自己的Java基础,在这里我要说句话(其实一万句都不够):Java基础非常重要!Java基础非常重要!Java基础非常重要! 一.Java基础 1.夯实Java基础(一)--数组 2.夯实Java基础(二)--面向对象之封装 3.夯实Java基础(三)--面向对

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

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

夯实JAVA基本之一 —— 泛型详解(1)

前言:无论何时,相信自己. 相关文章: 1.<夯实JAVA基本之一 -- 泛型详解(1)>2.<夯实JAVA基本之一 -- 泛型详解(2)> 一.引入 1.泛型是什么 首先告诉大家ArrayList就是泛型.那ArrayList能完成哪些想不到的功能呢?先看看下面这段代码: ArrayList<String> strList = new ArrayList<String>(); ArrayList<Integer> intList = new A