入坑.net core(二)新建一個.net core api
之前就練過反射,但是也只停留在練過,跟著程式碼無腦敲,敲完了就當自己學過了,反射是什麼?有什麼作用?怎麼使用?一問三不知,以至於之後看到了反射還覺得很陌生,今天把反射重新學了一遍,加深了理解,有了自己的思路,雖然不能說很熟練,但也算是開了一個好頭吧。---為了加強記憶,遂記之。
---前言
反射這一概念最早由程式設計開發人員Smith在1982年提出,主要指應用程式訪問、檢測、修改自身狀態與行為的能力。這一概念的提出立刻吸引了程式設計界的極大關注,各種研究工作隨之展開,隨之而來引發程式設計革命,出現了多種支援反射機制的面嚮物件語言。
在電腦科學領域,反射是指一類能夠自我描述和自控制的應用。在Java程式語言中,反射是一種強有力的工具,是面向抽象程式設計一種實現方式,它能使程式碼語句更加靈活,極大提高程式碼的執行時裝配能力。
定義
Java的反射(reflection)機制是指在程式的執行狀態中,可以構造任意一個類的物件,可以瞭解任意一個物件所屬的類,可以理了解任意一個類的成員變數和方法,可以呼叫任意一個物件的屬性和方法。這種動態獲取程式資訊以及動態呼叫物件的功能稱為Java語言的反射機制
程式碼中實現
-
獲得Class物件的三種方式
-
使用Class類的靜態方法forName(String className)
Class cObj = Class.forName("java.lang.String");
-
用類名呼叫該類的class屬性來獲得該類對應的Class物件,即”類名.class“
ClassObj = Test.class;
-
用物件呼叫getClass()方法來獲得該類對應的Class物件
Person person = new Person();
Classs cObj = person.getClass(); -
-
獲得Class物件之後,就可以通過class物件呼叫Class類的以下方法
說明:在通過getFields()和getMethods()方法依次獲得許可權為public的成員變數和方法時,還包含從超類中繼承到的成員變數和方法;而通過getDeclaredFields()和getDeclaredMethods()方法只是獲得在本類中定義的所有成員方法和變數
通過使用上述方法得到一個型別或者方法陣列之後,用他們本類中的方法可以對獲得的物件進行操作,另外還有一些常用的方法,例如:
方法 | 說明 |
---|---|
isVarArgs() | 檢視該構造方法是否允許帶有可變數量的引數,如果允許則返回true,否則返回false |
newInstance | 通過該構造方法利用指定引數建立一個該類的物件,如果未設定引數則表示採用預設無引數的構造方法 |
setAccessible(boolean flag) | 如果該構造方法的許可權為private,預設不允許通過反射利用newInstance()方法建立物件。如果先執行該方法,並將入口引數設為true,則允許建立 |
參考資料:
-
百度百科(JAVA反射機制)
-
-