Java基礎篇(JVM)——Class物件
Class物件
這篇文章算是補充的一點東西,主要看一看Class物件的相關知識。
主要關心的有以下幾個點:
- Class物件是什麼?
- Class物件和反射
- Class物件如何使用
Class物件是什麼
可以簡單這麼說:Class物件就是位元組碼檔案儲存的內容。所以將位元組碼載入進入記憶體中時,即在記憶體中生成了Class物件(Class物件和普通物件一樣,也是存放在堆中;儘管載入進來的類資訊是放在方法區當中的,這點要注意!)。
有Class物件,就有Class類。Class類、Class物件,普通類、普通物件的關係如圖:
Class物件的作用是:在執行時期提供或者獲得某個物件的型別資訊,這對於反射比較重要。
Class物件與反射
反射是指在執行時,對於任意一個類,都能夠動態地獲得並使用其成員屬性和方法。
語言的動態性是指,在執行時能夠改變結構或變數型別。Java語言是靜態語言,正是通過反射,才實現了動態性。Spring等框架也是基於反射才有了實現的可能。
如何獲得Class物件
三種方法:
- Class.forName("xxx"); ——Class的靜態方法
- obj.getClass(); ——繼承自Object類的普通方法
- Object.class(); ——類字面量
Class物件如何使用
主要可通過Class物件獲得構造器,靜態/普通變數,靜態/普通方法,需要用到下面三個類。
Constructor類:
首先獲得類構造器,再用Constructor類中的方法來使用構造器。
1. 獲得Constructor物件:
getConstructor(Class<?>... parameterTypes):返回指定引數型別、public訪問許可權的構造器
getDeclaredConstructor(Class<?>... parameterTypes):返回指定引數型別、所有訪問許可權的構造器
getDeclaredConstructor():返回所有訪問許可權的構造器
2. 使用構造器
獲得類的構造器後,可以用cons.newInstance(xx,xxx);來使用構造器來傳入引數,建立物件。
Filed類
常見方法:
1. 獲得Filed物件:
getFields:獲取public修飾的所有屬性,返回一個Field陣列(包括父類的)
getDeclaredFields:獲取所有屬性,返回一個Field陣列
getField:傳入一個引數(屬性名),獲取單個屬性,返回一個Field物件,只能獲取public修飾的
getDeclaredField:傳入一個引數(屬性名),獲取單個屬性,返回一個Field物件
2. 操作屬性:
myFiled.set(Object obj, Object value):設定指定物件中某個屬性的值;
get(Object obj):獲得指定物件中某個屬性的值;
Method類
常見方法:
1. 獲得Method物件:
getMethods:獲取所有的public修飾的方法,包括父類的,返回Method陣列
getDeclaredMethods:獲取所有的返回,不包括父類,返回Method陣列
getMethod:傳入一個引數(方法名),返回一個Method物件,只能獲取到public修飾的
getDeclared:傳入一個引數(方法名),返回一個Method物件
2. 呼叫方法:
method.invoke(Object obj,Object... args):呼叫指定物件的指定引數的方法。