zoukankan      html  css  js  c++  java
  • (反射):获取一个类的父类和父类的泛型

    一、解决问题

    • 获取一个类的父类和父类的泛型

    二、实现

    • Student.java
    package Test3;
    
    public class Student {
        private String name;
        private String sex;
        private String age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
        }
    
    }
    • Genericity.java
    package Test3;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.ParameterizedType;
    import java.util.HashMap;
    import java.util.Map;
    
    public abstract class Genericity<T> {
    
        @SuppressWarnings("rawtypes")
        protected Class clazz;
    
        @SuppressWarnings("unchecked")
        public Genericity() {
            // 通过反射机制获取子类传递过来的实体类的泛型类型信息
            //ParameterizedType类为Type类的子类,用于获得超类的泛型参数的实际类型。具体请查看(1)
            //this.getClass()用于获取子类的class信息。具体查看(2
            ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
            clazz = (Class<T>) type.getActualTypeArguments()[0];
        }
    
        protected Map<String, Object> getMap(T cla) {
            Map<String, Object> map = new HashMap<String, Object>();
    
            Field[] fields = clazz.getDeclaredFields();
    
            for (Field field : fields) {
                field.setAccessible(true);  //类中的成员变量为private,故必须进行此操作
                try {
                    map.put(field.getName(), field.get(cla));
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
    
            return map;
    
        }
    
    }
    • (1) ParameterizedType
      • getClass().getGenericSuperclass()
        返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type,然后将其转换ParameterizedType。
      • getActualTypeArguments()
        返回表示此类型实际类型参数的 Type 对象的数组。[0]就是这个数组中第一个了。简而言之就是获得超类的泛型参数的实际类型
      • Type和ParameterizedType可以理解为:  由一个类可以得到这个类的Type类型,比如一个类:Class Test extends Person<Student> Test这个类可以通过getClass().getGenericSuperclass()这个方法得到超类Person的Type,这个Type为:“Person所在的包.Person<Student所在的包.Student>”  ,而ParameterizedType.getActualTypeArguments则得到Person<Student>中的泛型类型(即Student)并返回Typ[]。
    • (2)在继承关系中,不管父类还是子类,这些类里面的this都代表了最终new出来的那个类的实例对象,在子类GenericityTest(继承于Genericity)中只是实例化了GenericityTest这个子类,而GenericityTest的构造方法中默认会默认调用父类Genericity的构造方法,而在父类Genericity的构造方法中存在this.getClass(),此时this.getClass()得到的Class为子类GenericityTest(因为GenericityTest有被new实例化,而父类的构造方法虽然被调用,但是调用构造方法并不是实例化对象)
    •  GenericityTest.java
    package Test3;
    
    import java.util.Map;
    
    import javax.swing.plaf.synth.SynthSeparatorUI;
    
    /**
     * 测试获取一个类的父类和父类的泛型
     * @author Administrator
     *
     */
    public class GenericityTest extends Genericity<Student> {
        public static void main(String[] args) {
            
            Student stu=new Student();
            stu.setName("张三");
            stu.setAge("15");
            stu.setSex("男");
            GenericityTest test=new GenericityTest();
            
            Map<String,Object> map=test.getMap(stu);
            
            System.out.println(map);
        }
    }

    结果:

  • 相关阅读:
    Debian 系统的ftp服务器安装配置
    一个程序员送给大学生弟弟的那些话
    javaWeb——Servlet(一)
    javaWeb——JSP(一)
    C语言中 lseek函数的使用规范
    ConcurrentHashMap原理
    线程池的原理
    zookeeper 是什么?zookeeper 都有哪些功能?
    RabbitMQ(转)
    数据库分库分表
  • 原文地址:https://www.cnblogs.com/shyroke/p/7284067.html
Copyright © 2011-2022 走看看