• 利用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>() {
                @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 + " " + type.getClass());
            //返回表示此类型实际类型参数的 Type 对象的数组,泛型的参数可能有多个,我们需要哪个就取哪个
            Type[] targets = type.getActualTypeArguments();
            for (int i = 0; i < targets.length; i++) {
                System.out.println(targets[i] + " " + 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 {

    }





  • 相关阅读:
    字符串与模式匹配算法(一):BF算法
    Spring MVC:HandlerMapping
    Spring MVC:DispatchServlet类
    Spring:面向切面编程的AOP
    Java:检查异常与未检查异常
    AOP源码解析:AspectJExpressionPointcutAdvisor类
    Vue+Webpack打包之后超过url-loader大小限制的图片在css的background-image中使用路径问题
    less
    ES6模块的import和export用法总结
    bootstrap4网格
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/5373283.html
Copyright © 2020-2023  润新知