1. 程式人生 > >Java基礎篇(JVM)——Class物件

Java基礎篇(JVM)——Class物件

Class物件  

這篇文章算是補充的一點東西,主要看一看Class物件的相關知識。
主要關心的有以下幾個點:

  1. Class物件是什麼?
  2. Class物件和反射
  3. Class物件如何使用

Class物件是什麼

可以簡單這麼說:Class物件就是位元組碼檔案儲存的內容。所以將位元組碼載入進入記憶體中時,即在記憶體中生成了Class物件(Class物件和普通物件一樣,也是存放在堆中;儘管載入進來的類資訊是放在方法區當中的,這點要注意!)。

有Class物件,就有Class類。Class類、Class物件,普通類、普通物件的關係如圖:

Class物件的作用是:在執行時期提供或者獲得某個物件的型別資訊,這對於反射比較重要。

Class物件與反射

反射是指在執行時,對於任意一個類,都能夠動態地獲得並使用其成員屬性和方法。

語言的動態性是指,在執行時能夠改變結構或變數型別。Java語言是靜態語言,正是通過反射,才實現了動態性。Spring等框架也是基於反射才有了實現的可能。

如何獲得Class物件

三種方法:

  1. Class.forName("xxx"); ——Class的靜態方法
  2. obj.getClass(); ——繼承自Object類的普通方法
  3. 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):呼叫指定物件的指定引數的方法。