1. 程式人生 > >反射 類的加載 Schema DOM 解析方式和解析器 命名空間

反射 類的加載 Schema DOM 解析方式和解析器 命名空間

htm 可能 分配 類對象 情況 之間 .exe 方法 class對象

Day15 反射

1.1 類的加載

當程序要使用某個類時,如果該類還未被加載到內存中,則系統會通過加載,連接,初始化三步來實現對這個類進行初始化。

l 加載

就是指將class文件讀入內存,並為之創建一個Class對象。

任何類被使用時系統都會建立一個Class對象

l 連接

驗證是否有正確的內部結構,並和其他類協調一致

準備負責為類的靜態成員分配內存,並設置默認初始化值

解析將類的二進制數據中的符號引用替換為直接引用

l 初始化

就是我們以前講過的初始化步驟

1.2 反射概述

Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為

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

文件,而這些Schema文件中定義了相同名稱的元素時就會出現名字沖突。這就像一個Java文件中使用了import java.util.*import java.sql.*時,在使用Date類時,那麽就不明確Date是哪個包下的Date了。

總之名稱空間就是用來處理元素和屬性的名稱沖突問題,與Java中的包是同一用途。如果每個元素和屬性都有自己的名稱空間,那麽就不會出現名字沖突問題,就像是每個類都有自己所在的包一樣,那麽類名就不會出現沖突。

1.2.1 3.解析方式和解析器

l 開發中比較常見的解析方式有三種,如下:

  1. DOM:要求解析器把整個XML文檔裝載到內存,並解析成一個Document對象。

a) 優點:元素與元素之間保留結構關系,故可以進行增刪改查操作。

b) 缺點:XML文檔過大,可能出現內存溢出顯現。

  1. SAX:是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。並以事件驅動的方式進行具體解析,每執行一行,都將觸發對應的事件。(了解)

a) 優點:處理速度快,可以處理大文件

b) 缺點:只能讀,逐行後將釋放資源。

  1. PULLAndroid內置的XML解析方式,類似SAX。(了解)

l 解析器:就是根據不同的解析方式提供的具體實現。有的解析器操作過於繁瑣,為了方便開發人員,有提供易於操作的解析開發包。

技術分享圖片

l 常見的解析開發包:

n JAXPsun公司提供支持DOMSAX開發包

n JDomdom4j兄弟

n jsoup:一種處理HTML特定解析開發包

n dom4j:比較常用的解析開發包,hibernate底層采用。

技術分享圖片

  1. 反射怎麽理解,說一下反射經典的應用

答案:

反射是什麽呢?當我們的程序在運行時,需要動態的加載一些類這些類可能之前用不到所以不用加載到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 解析方式和解析器 命名空間