反射

1)框架設計的靈魂: 反射

2)框架(半成品軟件): 
	也許你用框架時,並不需要框架.

3)什麼是反射?
	將類的各個組成部分封裝成其它對象,這就是反射機制;  

	好處: 
		1.可以在程序運行過程中,操作這些對象:
			如:
				String str = "abc";
				str.xxx 爲何會有提示呢? 就是Method對象了. IDEA就是利用反射機制知道有哪些方法;

		2.解耦(降低程序的耦合性,提高程序的可擴展性)


4)Java代碼在計算機中運行經理的3階段:
	(1)Person.java
	(2)javac編譯java文件
	(3)在硬盤上生成了 Person.class 字節碼文件(類名字、成員變量、成員方法、構造等)
		

	1:源代碼階段:
		成員變量
		構造
		成員方法

	2: Class類對象階段 
		Person.class 經過類加載器ClassLoader將Person.class字節碼文件加載到內存中:
			有一個對象描述字節碼文件(Class: 描述字節碼文件)

		共同的屬性: 
			成員變量: Field[] fields 對象
			構造方法: Contructor[] cons 對象
			成員方法: Method[] methods 對象

			從而可以創建具體的對象.

	3:Person對象(運行時階段)

5)關鍵之處: 獲取字節碼 Class對象, 有3種方式(對應3個階段): 字節碼物理文件 在內存中生成的對象
	(1)將字節碼文件加載到內存生成Class對象:  
		Class.forName("全類名")

		用途: 多用於配置文件(字符串),將類名定義在配置文件中,讀取文件,加載類;

	(2)已經字節碼文件在內存了,通過類名獲取:
		類型.class: 通過類名的屬性獲取

		用途: 多用於函數中傳參數

	(3)通過Class類對象階段
		對象.getClass()方法:
			在Object中定義,意味着所有的對象有這個方法;

		用途: 多用於對象的獲取字節碼的方式;

	用 == 這樣進行地址值的比較;

	結論: 同一個字節碼文件(*.class)在一次程序運行過程中,只會被加載一次,不論通過哪一種方式獲取的Class對象
			都是同一個.

6)Class對象功能概述:
	獲取功能:
		1.獲取成員變量們
			Field[] getFields()-->獲取public

			Field getField(String name)-->獲取指定名稱的public

			Field[] getDeclredField(String name)

			Field getDeclredField(String name)-->可以獲取所有的,包括私有的. 說明在反射面前,沒有什麼共有私有.
				忽略安全(暴力反射): setAccesssible(true) 

		2.獲取構造方法們
			獲取完構造方法,就可以創建對象 
			Contructor constructor = personClass.getConstructor(String.class, int.class)
			constructor.newInstance(xx, xx)

		3.獲取成員方法們
			作用: 用於執行方法
				對象, 參數列表
				method.gteName()


		4.獲取類名
			personClass.getName()-->包名.類名

7)Field:
	get(x)
	set(x, x )

8)通過字節碼文件對應的類加載器來獲取路徑.

9)通過改物理的配置文件,改一下,能改變程序運行行爲

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章