java中反射機制的基本語法及練習


在思否上面開了一個專欄,主要是想對零散的知識點作一個梳理,在與你們交流的同時,也增強本身的理解。


  今天主要談一下Java中的反射機制,雖然實際編程中咱們不多直接使用,可是反射機制卻始終圍繞着咱們java程序員。咱們知道由Java語言編寫的程序須要通過編譯和解釋兩個步驟,通過編譯生成一種與平臺無關的字節碼文件,即*.class文件。將 *.class文件讀入內存,並建立一個java.lang.Class對象的過程稱爲類的加載,在這兒咱們先不談類的加載機制,今天的重點是反射,之因此有上面的介紹,是由於反射就是經過該Class對象訪問整個類的一個過程java


  • 獲取Class對象的三種方式:
    使用Class類的forName(String clazzName)靜態方法
    調用某個類的class屬性獲取該類的Class對象,eg:Student.class
    調用某個對象的getClass()方法, eg:student.getClass()
  • 獲取Class對應類所包含的構造方法
    Constructor<T> getConstructor():返回對應類無參的public構造方法
    Constructor<T> getConstructor(Class<?> ...parameterTypes):返回對應類帶指定形參列表的public構造方法
    Constructor<?>[] getConstructors():返回對應類全部public構造方法
    Constructor<?>[] getDeclaredConstructors():返回對應類的全部構造方法
  • 獲取Class對應類所包含的普通方法
    Method getMethod(String name,Class<?> ... parameterTypes):返回對應類的帶指定形參列表的public方法
    Method[] getMethods():返回對應類的全部public方法
    Method getDeclaredMethod(String name,Class<?> ... parameterTypes):返回對應類的帶指定形參列表的方法
    Method[] getDeclaredMethods():返回對應類的所有方法


  • 獲取Class對應類所包含的成員變量
    Field getField(String name):返回對應類指定指定名稱的public成員變量
    Filed[] getFields():返回對應類的全部public成員變量
    Filed getDeclaredField(String name):返回對應類的指定名稱的成員變量
    Filed[] getDeclaredFields():返回對應類的所有成員變量

 上面利用Class對象獲取對應類的構造方法、普通方法、成員變量都比較簡單,之因此放在這兒,是方便查看,因此不給出示例代碼。


 接下來,着重介紹兩個利用反射的典型例子:程序員

Spring利用反射實現控制反轉(IOC)的具體實現

這兒有具體的實現過程,有興趣能夠本身寫一遍,有助於更好的理解編程

利用反射實現泛型的擦除

public class GenericErasure {
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("你好");
        Class<? extends List> clazz = list.getClass();
        Method method = clazz.getMethod("add",Object.class);
        method.invoke(list, 1);
        for (Object ele : list) {
            System.out.println(ele);
        }
    }
}

 定義一個泛型爲String的list集合,使用反射技術,能夠實現泛型的擦除,加入int類型的值。segmentfault

相關文章
相關標籤/搜索