1. 程式人生 > 其它 >java--反射--型別擦除

java--反射--型別擦除

  1. 下限型別的泛型方法和泛型類,在編譯期之後泛型類也會擦除,替換為Object型別,於無限制的泛型類和泛型方法一致

  2. package com.model.fanxing;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.List;
    
    /**
     * @Description:測試類
     * @Author: 張紫韓
     * @Crete 2021/7/1 17:04
     */
    public class FanXingDemo10 {
        public static
    void main(String[] args) { TestOne<Integer> testOne01 = new TestOne<>(); TestOne<String> testOne02 = new TestOne<>(); //不同型別的,泛型類物件,他們的Class類物件是一樣的,都是由這個類物件建立的例項 System.out.println(testOne01.getClass() == testOne02.getClass()); //通過反射得到TestOne的Class類物件
    Class<? extends TestOne> aClass = testOne01.getClass(); // 獲取成員變數的物件 Field[] fields = aClass.getDeclaredFields(); for (Field f:fields){ System.out.println(f.getName()+"\t"+f.getType().getSimpleName()); //在編譯器結束之後,會對泛類進行擦除操做,即將泛型類中的所有泛型的資料型別都程式設計 Object型別的資料
    // 即成員變數將不再是 Integer型別,被擦除為 Object型別了,所以所有的成員變數的 執行時資料型別為 Object型別 } TestTwo<Number> testTwo = new TestTwo<>(); Class<? extends TestTwo> aClass1 = testTwo.getClass(); Field[] field = aClass1.getDeclaredFields(); for (Field f:field){ System.out.println(f.getName()+"\t"+f.getType().getSimpleName()); //在編譯器結束之後,會對泛類進行擦除操做,即將泛型類中的所有泛型的資料型別都程式設計 Object型別的資料 // 即成員變數將不再是 Integer型別,被擦除為 Object型別了,所以所有的成員變數的 執行時資料型別為 Object型別 } //泛型方法,T也會被替換為上限型別(List) TestThree<Object> testThree = new TestThree<>(); Class<? extends TestThree> aClass2 = testThree.getClass(); Method[] methods = aClass2.getMethods(); for (Method m:methods){ System.out.println(m.getName()+"\t"+m.getReturnType().getSimpleName()); } System.out.println("------------------------------"); Class<TestFourImpl> aClass3 = TestFourImpl.class; Method[] declaredMethods = aClass3.getDeclaredMethods(); for (Method m:declaredMethods){ System.out.println(m.getName()+"\t"+m.getReturnType().getSimpleName()); //在介面的實現類中會有連個方法,一個是放回Integer型別的(自己寫的),還有一個是為了保持介面和實現類的關係,返回值型別是Object型別 } } } class TestOne<T>{ private T name; //在編譯期是T型別的資料,編譯器結束會倍換成 Object型別的資料, } class TestTwo<T extends Number>{ private T name; //在編譯期是T型別的資料,編譯器結束會倍換成 Number型別的資料,所以才能對不同型別的資料進行操做 } class TestThree<T>{ private T name; public static <T extends List> T show(T t){ return t; } } interface TestFour<T>{ T get(T var); } class TestFourImpl implements TestFour<Integer>{ @Override public Integer get(Integer var) { return var; } }