//利用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>() {
            @Override
            public void onSuccess(Student data) {
            }
        };
        //getClass().getGenericSuperclass()返回表示此 Class 所表示的实体的直接超类的 Type
        ParameterizedType type = (ParameterizedType) mySuperClass.getClass().getGenericSuperclass();
        sysoType(type);
    }
    private static void interfaceTest() {
        MyInterface<Student, String> myInterface = new MyInterface<Student, String>() {
            @Override
            public void onSuccess(Student data) {
            }
        };
        ParameterizedType type = (ParameterizedType) myInterface.getClass().getGenericInterfaces()[0];
        sysoType(type);
    }
    private static void sysoType(ParameterizedType type) {
        /*com.bqt.generic.MySuperClass<com.bqt.generic.Student, java.lang.String>
        class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
        class com.bqt.generic.Student
        class java.lang.Class
        class java.lang.String
        class java.lang.Class
        
        com.bqt.generic.MyInterface<com.bqt.generic.Student, java.lang.String>
        class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
        class com.bqt.generic.Student
        class java.lang.Class
        class java.lang.String
        class java.lang.Class*/
        System.out.println(type + "\n" + type.getClass());
        //返回表示此类型实际类型参数的 Type 对象的数组,泛型的参数可能有多个,我们需要哪个就取哪个
        Type[] targets = type.getActualTypeArguments();
        for (int i = 0; i < targets.length; i++) {
            System.out.println(targets[i] + "\n" + targets[i].getClass());
        }
    }

}


public abstract class MySuperClass<T,V> {

    public abstract void onSuccess(T data);

}


public interface MyInterface<T,V> {
    void onSuccess(T data);

}


public class Student {

}


利用ParameterizedType获取泛型参数类型的更多相关文章

  1. JAVA基础_反射获取泛型参数类型

    我经常会想获取参数的实际类型,在Hibernate中就利用的这一点. domain: Person.java public class Person { // 编号 private Long id; ...

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

    最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使 ...

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

    最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使 ...

  4. java 编程基础 反射方式获取泛型的类型Fileld.getGenericType() 或Method.getGenericParameterTypes(); (ParameterizedType) ;getActualTypeArguments()

    引言 自从JDK5以后,Java Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如,String.class的类型实际上是 Class 如果 Class 对应的类暂时未知,则使 C ...

  5. ParameterizedType获取java泛型参数类型

    ParameterizedType getClass().getGenericSuperclass() 返回表示此 Class 所表示的实体(类.接口.基本类型或 void)的直接超类的 Type,然 ...

  6. 利用 js 获取地址栏参数

    1.aspx页面,进行页面跳转 window.location.href = "ProviderInfo.aspx?ProviderID="+ProviderID; 2.Provi ...

  7. 获取List、Set、Map等字段的泛型参数

    测试类加单元测试方法,运行结果在注释里面: package temp; import org.junit.Test; import java.lang.reflect.Field; import ja ...

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

    通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class&l ...

  9. 获取泛型的class 反射

    最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使 ...

随机推荐

  1. 实验五:分析system_call中断处理过程

    原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...

  2. Spring ApplicationContext的事件机制

    ApplicationContext的事件机制是观察者设计模式的实现,通过 ApplicationEvent 类和 ApplicationListener 接口,可以实现 ApplicationCon ...

  3. nginx的使用配置

    nginx为反向代理服务器,可以反向代理不同域名转向不同的具体服务器.可以用于负载压力或是同一台机器使用不同域名进行访问. 以下片段是服务器配置: #user cmcc; worker_process ...

  4. [Delphi]检查URL是否有效的函数

    function CheckUrl(url: string): boolean; var hSession, hfile, hRequest: hInternet; dwindex, dwcodele ...

  5. 使用Qt编写模块化插件式应用程序

    动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...

  6. Java Tomcat SSL 服务端/客户端双向认证

    借花献佛:http://www.blogjava.net/icewee/archive/2012/06/04/379947.html

  7. 【HDOJ】3500 Fling

    题意巨难懂.简言之,就是球互相碰撞时,主动碰撞的球将会停止,另一个球将沿着碰撞方向继续移动,不断碰撞.但是无法弹射紧挨着的球,但是若a弹射b,bc相邻,这种情况b可以弹射c. #include < ...

  8. Asteroids(二分图最大匹配模板题)

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12323   Accepted: 6716 Description Bess ...

  9. BZOJ1642: [Usaco2007 Nov]Milking Time 挤奶时间

    1642: [Usaco2007 Nov]Milking Time 挤奶时间 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 525  Solved: 30 ...

  10. has-a关系——包含对象成员的类

    #ifndef _STUDENT_H_ #define _STUDENT_H_ #include <iostream> #include <string> #include & ...