反射 類的加載 Schema DOM 解析方式和解析器 命名空間
Day15 反射
1.1 類的加載
當程序要使用某個類時,如果該類還未被加載到內存中,則系統會通過加載,連接,初始化三步來實現對這個類進行初始化。
l 加載
就是指將class文件讀入內存,並為之創建一個Class對象。
任何類被使用時系統都會建立一個Class對象
l 連接
驗證是否有正確的內部結構,並和其他類協調一致
準備負責為類的靜態成員分配內存,並設置默認初始化值
解析將類的二進制數據中的符號引用替換為直接引用
l 初始化
就是我們以前講過的初始化步驟
1.2 反射概述
Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為
3.反射_Class對象的初始化時機
1).創建類的實例
Student stu = new Student();
2).第一次使用這個類的靜態變量,或者為靜態變量賦值
System.out.println(Student.靜態變量名);
3).第一次調用類的靜態方法
Student.靜態方法名();
4).使用反射方式來強制創建某個類或接口對應的java.lang.Class對象【今天講】
5).第一次初始化某個類的子類
class Person{}
class Student extends Person{}
main(){
Student stu = new Student();//同時也會創建父類對象,在創建父類對象前,會先創建父類的Class對象;
}
6).直接使用java.exe命令來運行某個主類
C:\>java Demo //創建Demo的Class對象
Day16
Schema是新的XML文檔約束;
Schema要比DTD強大很多,是DTD 替代者;
Schema本身也是XML文檔,但Schema文檔的擴展名為xsd,而不是xml。
Schema 功能更強大,數據類型更完善
Schema 支持名稱空間
1.2.1.1.1 2.什麽是命名空間
如果一個XML文檔中使用多個Schema
總之名稱空間就是用來處理元素和屬性的名稱沖突問題,與Java中的包是同一用途。如果每個元素和屬性都有自己的名稱空間,那麽就不會出現名字沖突問題,就像是每個類都有自己所在的包一樣,那麽類名就不會出現沖突。
1.2.1 3.解析方式和解析器
l 開發中比較常見的解析方式有三種,如下:
- DOM:要求解析器把整個XML文檔裝載到內存,並解析成一個Document對象。
a) 優點:元素與元素之間保留結構關系,故可以進行增刪改查操作。
b) 缺點:XML文檔過大,可能出現內存溢出顯現。
- SAX:是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。並以事件驅動的方式進行具體解析,每執行一行,都將觸發對應的事件。(了解)
a) 優點:處理速度快,可以處理大文件
b) 缺點:只能讀,逐行後將釋放資源。
- PULL:Android內置的XML解析方式,類似SAX。(了解)
l 解析器:就是根據不同的解析方式提供的具體實現。有的解析器操作過於繁瑣,為了方便開發人員,有提供易於操作的解析開發包。
l 常見的解析開發包:
n JAXP:sun公司提供支持DOM和SAX開發包
n JDom:dom4j兄弟
n jsoup:一種處理HTML特定解析開發包
n dom4j:比較常用的解析開發包,hibernate底層采用。
- 反射怎麽理解,說一下反射經典的應用
答案: 反射是什麽呢?當我們的程序在運行時,需要動態的加載一些類這些類可能之前用不到所以不用加載到jvm,而是在運行時根據需要才加載,這樣的好處對於服務器來說不言而喻,舉個例子我們的項目底層有時是用mysql,有時用oracle,需要動態地根據實際情況加載驅動類,這個時候反射就有用了,假設 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection這兩個類我們要用,這時候我們的程序就寫得比較動態化,通過Class tc = Class.forName("com.java.dbtest.TestConnection");通過類的全類名讓jvm在服務器中找到並加載這個類,而如果是oracle則傳入的參數就變成另一個了。這時候就可以看到反射的好處了,這個動態性就體現出java的特性了!舉個例子,使用spring中會發現當你配置各種各樣的bean時,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就會根據你的需求去動態加載,你的程序就能健壯地運行。 |
反射 類的加載 Schema DOM 解析方式和解析器 命名空間