生活随笔
收集整理的這篇文章主要介紹了
(反射):获取一个类的父类和父类的泛型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、解決問題
?
二、實現
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;}@Overridepublic String toString() {return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]"
;}} 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實例化,而父類的構造方法雖然被調用,但是調用構造方法并不是實例化對象)
?
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);}
} 結果:
?
轉載于:https://www.cnblogs.com/shyroke/p/7284067.html
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的(反射):获取一个类的父类和父类的泛型的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。