一、什麼叫Java反射機制?
Java中的反射機制是指在運行狀態中,對於任意一個類,能夠動態獲取這個類中的屬性和方法;對於任意一個對象,都能夠任意調用它的屬性和方法。這種動態獲取類的信息以及動態調用對象方法的功能稱為Java的反射機制。總結就是:反射可以實現運行時知道任意一個類的屬性和方法。
二、Java當中為什麼需要反射機制?工作原理是什麼?
要明白為什麼需要反射機制,首先就得先清楚兩個概念:
(1)靜態編譯:在編譯時就必須要知道變量得類型才能編譯通過,比如C++,Java等編譯之前必須清楚的指明數據類型;
(2)動態編譯:顯然和上述概念相反,即在編譯時不需要立即知道變量的類型,在運行時指明其類型就行。
有上述概念之後便有了靜態語言和動態語言之分,而Java,C++就是典型的靜態語言,而Python,Ruby等則為動態語言。但是Java雖是一個靜態的解釋型語言,但其也有動態的性質------反射(Reflection)。用在Java身上指的是運行時加載,探知,使用編譯期間未知的classes。
下面探討一下反射是如何在僅知道類名的情況下能夠知道整個類的完整構造的(方法,屬性等)。
首先我們都清楚,Java是一種解釋型的語言,即編譯器首先將源碼編譯成class文件,然後虛擬機(JVM)再將class文件解釋給目標計算機執行。而這裡所說的反射機制操作的其實就是源碼編譯之後的class文件。首先將class文件加載到內存,然後從該文件中解剖出某個具體類的構造函數,方法和屬性,從而完全知道某個類的所有構造。
三、反射的使用及入門
在使用反射之前,最好清楚一個這樣的概念,即類類型。在程式語言中,各種數據都有其數據類型,那麼對於類本身而言,它也有自己的類型,即類類型,其實和普通的數據類型差不多,清楚這一點就行。類是java.lang.Class類的實例對象,而Class是所有類的類(There is a class named Class)。對於普通的類實例化時只需要new一個就行,但是要想用new實例化Class是行不通的,因為Class的構造器是私有的(自行查看源碼)。
1、獲取某個類(Student)的Class對象的三種方法:
(1)Class c1=Student.class;//通過Student類隱藏的靜態變量來獲取
(2)Class c2=Student.getClass();//通過Stduent的getClass()方法
(3)Class c3=Student.forName("com.tyf.reflect.Student");//com.tyf.reflect.Student為Student類的全類名。
注意:這裡的c1,c2,c3是完全一樣的,都是Class的對象(學名 類類型)。這裡不必糾結Student和c1,c2,c3是否一樣了(都叫Class對象),只需了解類類型是什麼就行。