父類如何獲取子類傳遞的泛型

package com.reflect.other;

import java.io.Serializable;

/**
 * 簡單pojo類(測試用,無具體意義)
 * 
 * @author edgewalk
 * @date 2017年6月5日
 */
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
package com.reflect.other;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 父類
 * 
 * @author edgewalk
 * @date 2017年6月5日
 * @param <T>泛型,可以由之類繼承傳遞
 */
public class Parent<T> {
    /**
     * 用於接收傳遞的clazz
     */
    private Class clazz;

    // 獲取子類傳遞給他的具體泛型類型
    public Parent() {
        // 1獲取子類的class(在創建子類對象的時候,會返回父類的構造方法)
        Class<? extends Parent> clazz = this.getClass(); // Student
        // 2獲取當前類的帶有泛型的父類類型
        ParameterizedType type = (ParameterizedType) clazz.getGenericSuperclass();
        // 3返回實際參數類型(泛型可以寫多個)
        Type[] types = type.getActualTypeArguments();
        // 4 獲取第一個參數(泛型的具體類) Person.class
        clazz = (Class) types[0];
    }
}
package com.reflect.other;
/**
 * 子類
 * @author edgewalk
 * @date  2017年6月5日
 */
public class Student extends Parent<Person> {
    /**
     * 當我們創建本類對象的時候,會先創建一個student類的空參構造,
     * 然後會返回父類的空參構造(Parent),此時父類就會獲取到子類傳遞給他的泛型,在父類中執行相關操作
     */
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章