JAVA類加載、反射和註解

#1、類加載概述 Class文件由類裝載器裝載後,在JVM中將造成一份描述Class結構的元信息對象,經過該元信息對象能夠獲知Class的結構信息:如構造函數,屬性和方法等,Java容許用戶藉由這個Class相關的元信息對象間接調用Class對象的功能。java

虛擬機把描述類的數據從class文件加載到內存,並對數據進行校驗,轉換解析和初始化,最終造成能夠被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。數組

java安全沙箱(一)之ClassLoader雙親委派機制安全

#2、類加載工做機制 類裝載器就是尋找類的字節碼文件,並構造出類在JVM內部表示的對象組件。在Java中,類裝載器把一個類裝入JVM中,要通過如下步驟:框架

(1) 裝載:查找和導入Class文件;

 (2) 連接:把類的二進制數據合併到JRE中;

    (a)校驗:檢查載入Class文件數據的正確性;

    (b)準備:給類的靜態變量分配存儲空間;

    (c)解析:將符號引用轉成直接引用;

 (3) 初始化:對類的靜態變量,靜態代碼塊執行初始化操做

輸入圖片說明

#3、類加載方式 一、命令行啓動應用時候由JVM初始化加載
二、經過Class.forName()方法動態加載
三、經過ClassLoader.loadClass()方法動態加載函數

#4、反射 Java反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法,對於任意一個對象,都可以調用它的任意一個方法和屬性,這種動態獲取的信息以及動態調用對象的方法的功能。工具

主要提供瞭如下功能: 在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具備的成員變量和方法,在運行時調用任意一個對象的方法,生成動態代理。ui

利用Reflection APIs取得任何已知名稱的類的內部信息,包括:package、 type parameters、 superclass、 implemented interfaces、 inner classes、 outer classes、 fields、 constructors、 methods、 modifiers等,並能夠在執行的過程當中,動態生成instances、變動fields內容或喚起methods。.net

  1. 獲取構造方法

// 根據構造函數的參數,返回一個具體的具備public屬性的構造函數
Constructor getConstructor(Class[] params)命令行

// 返回全部具備public屬性的構造函數數組
Constructor getConstructors()代理

// 根據構造函數的參數,返回一個具體的構造函數(不分public和非public屬性)
Constructor getDeclaredConstructor(Class[] params)

// 返回該類中全部的構造函數數組(不分public和非public屬性)
Constructor getDeclaredConstructors()

  1. 獲取類的成員方法

// 根據方法名和參數,返回一個具體的具備public屬性的方法 Method getMethod(String name, Class[] params)

// 返回全部具備public屬性的方法數組 Method[] getMethods()

// 根據方法名和參數,返回一個具體的方法(不分public和非public屬性) Method getDeclaredMethod(String name, Class[] params)

// 返回該類中的全部的方法數組(不分public和非public屬性) Method[] getDeclaredMethods()

  1. 獲取類的成員變量(成員屬性)

// 根據變量名,返回一個具體的具備public屬性的成員變量 Field getField(String name)

// 返回具備public屬性的成員變量的數組 Field[] getFields()

// 根據變量名,返回一個成員變量(不分public和非public屬性) Field getDeclaredField(String name)

// 返回全部成員變量組成的數組(不分public和非public屬性) Field[] getDelcaredFields()

#5、註解 Annotation實際上是一種接口。經過Java的反射機制相關的API來訪問annotation信息。相關類(框架或工具中的類)根據這些信息來決定如何使用該程序元素或改變它們的行爲。

Annotation是不會影響程序代碼的執行,不管annotation怎麼變化,代碼都始終如一地執行。 Java語言解釋器在工做時會忽略這些annotation,所以在JVM中這些annotation是「不起做用」的,只能經過配套的工具才能對這些annontaion類型的信息進行訪問和處理。

Annotation與interface的異同:

  • Annotation類型使用關鍵字@interface而不是interface。這個關鍵字聲明隱含了一個信息:它是繼承了java.lang.annotation.Annotation接口,並不是聲明瞭一個interface;
  • Annotation類型、方法定義是獨特的、受限制的。Annotation 類型的方法必須聲明爲無參數、無異常拋出的。這些方法定義了annotation的成員:方法名成爲了成員名,而方法返回值成爲了成員的類型。而方法返回值類型必須爲primitive類型、Class類型、枚舉類型、annotation類型或者由前面類型之一做爲元素的一維數組。方法的後面可使用 default和一個默認數值來聲明成員的默認值,null不能做爲成員默認值,這與咱們在非annotation類型中定義方法有很大不一樣。Annotation類型和它的方法不能使用annotation類型的參數、成員不能是generic。只有返回值類型是Class的方法能夠在annotation類型中使用generic,由於此方法可以用類轉換將各類類型轉換爲Class。

Annotation類型又與接口有着近之處:

  • 能夠定義常量、靜態成員類型(好比枚舉類型定義)。Annotation類型也能夠如接口通常被實現或者繼承。
相關文章
相關標籤/搜索