天天看點

注解和反射學習

概念:顧名思義,與注釋類似注釋給人看,而注解可以給程式掃描讀取資訊

作用:

不是程式本身,可以對程式作出解析

可以被其他程式讀取

自定義

組成

元注解

@Target 作用目标

@Retention 保留區域

@Document 文檔儲存

@Inherited 子類繼承

@interface

字段

類型 + 字段名 如:String[] name()

若字段名為 value() 使用的時候可以預設不寫

若追加default預設值 使用的時候不會要求必須填寫字段值

概念

Java的反射(reflection)機制是指在程式的運作狀态中,可以構造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調用任意一個對象的屬性和方法。這種動态擷取程式資訊以及動态調用對象的功能稱為Java語言的反射機制。反射被視為動态語言的關鍵

原理

類在加載到JVM的過程中,會在JVM的方法區堆記憶體中存儲類的資訊,再在普通堆記憶體中生成類的class鏡像作為方法區類的資訊的通路入口

類加載到虛拟機的過程為:

加載 --> 連接配接 --> 初始化 --> 使用 --> 解除安裝

加載:虛拟機提供的各種加載器,預設先加載環境所需要的類檔案,如ext中的

連接配接:

驗證:檢查代碼符合虛拟機讀取解析的規範

準備:記憶體準備 正式為類變量配置設定記憶體并設定預設值,該階段在方法區堆記憶體進行

解析:虛拟機常量池的符号引用(常量名)替換為直接引用(位址)的過程

擷取

全限類名擷取

對象擷取

Class類的靜态方法 Class.forName()加載擷取

内置基本類型 類名.Type擷取

ClassLoader擷取

性能方面

因為能擷取所有類資訊,功能強大,但性能能耗卻很高

在擷取私有資訊時,使用accessible(true)方法開啟通路,性能能耗會降低