java的泛型與反射機制


什么是泛型?

泛型,即“參數化類型”。顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之為類型形參),然后在使用/調用時傳入具體的類型(類型實參)。

為什么要使用泛型?

先看如下代碼:

public class GenericTest {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("qqyumidi");
        list.add("corn");
        list.add(100);

        for (int i = 0; i < list.size(); i++) {
            String name = (String) list.get(i); // 1
            System.out.println("name:" + name);
        }
    }
}

 在如上的編碼過程中,我們發現主要存在兩個問題:

  1.當我們將一個對象放入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,改對象的編譯類型變成了Object類型,但其運行時類型任然為其本身類型。

  2.因此,//1處取出集合元素時需要人為的強制類型轉化到具體的目標類型,且很容易出現“java.lang.ClassCastException”異常。

使用泛型后寫法:

public class GenericTest {

    public static void main(String[] args) {
        /*
        List list = new ArrayList();
        list.add("qqyumidi");
        list.add("corn");
        list.add(100);
        */

        List<String> list = new ArrayList<String>();
        list.add("qqyumidi");
        list.add("corn");
        //list.add(100);   // 1  提示編譯錯誤

        for (int i = 0; i < list.size(); i++) {
            String name = list.get(i); // 2
            System.out.println("name:" + name);
        }
    }
}

采用泛型寫法后,在//1處想加入一個Integer類型的對象時會出現編譯錯誤,通過List<String>,直接限定了list集合中只能含有String類型的元素,從而在//2處無須進行強制類型轉換,因為此時,集合能夠記住元素的類型信息,編譯器已經能夠確認它是String類型了。

 

反射機制是什么?

 

反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

反射機制能做什么?

 

反射機制主要提供了以下功能: 

  • 在運行時判斷任意一個對象所屬的類;

  • 在運行時構造任意一個類的對象;

  • 在運行時判斷任意一個類所具有的成員變量和方法;

  • 在運行時調用任意一個對象的方法;

  • 生成動態代理。

反射機制的實用案例

利用反射機制獲取類的方法名、返回值、參數,代碼如下

package fanxingText;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class FxTest {

    public static void main(String[] args) {
        
        List l = new ArrayList<>();        
        pointClassInfo(l);
        
    }

    public static void pointClassInfo(Object o){
        
        Method[] methods = (o.getClass()).getMethods();
        
        for(Method method : methods){
            System.out.print(method.getReturnType().getName() +" ");
            System.out.print(method.getName() +" " + "(");
            for(Class c : method.getParameterTypes()){
                System.out.print(c.getName()+ ",");
            }
            System.out.println(")"); 
        }
    }
}

利用反射機制將泛型為String的ArrayList中存放一個Integer類型的對象,代碼如下:

package fanxingText;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class SetArrayList {

    public static void main(String[] args) throws Exception {
        
        SetArrayListOtherParam();
            
    }
    
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void SetArrayListOtherParam() throws Exception{
        List<String> strings = new ArrayList<String>();
        
        System.out.println(strings.add("111"));
                
        Class c = strings.getClass();
        
        Method m  = c.getMethod("add",Object.class);
        
        m.invoke(strings, 1000);
        
        for(Object o : strings){
            System.out.println(o);
        }
        
        
    }

}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM