java基礎之Gui編程和反射

1.GUI 即圖形用戶界面
也就是應用程序提供個給用戶操作的圖形界面;包括窗口,菜單,按鈕,工具欄和其他各種圖形界面元素。

java 針對 GUI提供了類分別位於 java.awt 和 javax.swing 包中,簡稱 AWT 和 Swing。

2. 類初始化時機:

創建類的實例;

訪問類的靜態變量,或者爲靜態變量賦值;

調用類的靜態方法;

使用反射方式來強制創建某個類或接口對應的 java.lang.Class 對象;

初始化某個類的子類;

直接使用 java.exe 命令來運行某個主類;

3. 類加載器:

Bootstrap ClassLoader 根類加載器:被稱之爲引導類加載器,負責 java 核心類的加載;比如 System , String 等;在 JDK 的 lib 目錄下的 jr.jar 文件中;

Extension ClassLoader 擴展類加載器: 擴展類加載器,負責 JDK 的擴展目錄中 jar 包的加載。在 JDK 的 lib 目錄下的 ext 文件中;

System ClassLoader 系統類加載器:負責在 JVM 啓動時來加載來自 java 命令的 class 文件,以及環境變量和 classPath 所指定的類路徑和包;

4. 反射: java 的反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都可以調用它的任意一個屬性或者方法;這種動態的獲取類的屬性
以及動態調用類的方法的功能稱爲 java 的反射機制。

JAVA反射機制是在運行狀態中,對於任意一個類(class文件),都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象方法的功能稱爲java語言的反射機制。

    動態獲取類中信息,就是java反射。可以理解爲對類的解剖。

    如果想要對指定名稱的字節碼文件進行加載並獲取其中的內容並調用,這時就使用到了反射技術。

    所謂的框架就是對外提供一些接口,也就是功能擴展的標準,由實現類按照這個接口標準去實現。框架內部如果需要操縱這些實現類的對象完成某些操作,那麼只需要把這些實現類的全名(包名+類名)寫在某個配置文件中,框架代碼只需要讀取這個配置文件,就可以獲取這個實現類的字節碼文件,然後利用反射技術創建這個實現類的對象並且調用相應的方法完成一些操作。

    用於描述字節碼的類就是Class類,創建對象,可以提取字節碼文件中的內容,如字段、構造函數、一般函數。該類就可以獲取字節碼文件中的所有內容,那麼反射就是依靠該類完成的。想要對一個類文件進行解剖,只要獲取到該類的字節碼文件對象即可。

5. 獲取 Class 對象的三種方式:
1.使用 Objeect 類的 getClass() 方法; 例如: Person p = new Person(); Class cla = p.getClass();

2.通過數據類型的靜態屬性 class  例如: Class cla = Person.class;

3.Class 類中的靜態方法 public static class<?> void forName( String name){}  例如:Class cla = Class.forName( "UserClass.Person");

6. 通過反射獲取構造函數:
當獲取得到 Class 對象後,可以通過 getConstructor() 和 getDeclaredConstructor() 來獲取類中的構造函數,同時也要根據構造函數的參數來傳入相應的參數。

注意這兩個方法的區別:當構造函數爲非 public  的時候,使用後者來獲取;其他情況下一般使用前者。

具體代碼例如:
Class cla = Class.forName( "UserClass.Person");
Constructor cons = cla.getConstructor();

7. 通過反射獲取成員變量:
通過 getField() 和 getDeclaredField() 來獲取類中的字段,方法中的參數爲想要獲取的 field 字段。

兩者的區別與 getConstructor() 和 getDeclaredConstructor() 的區別類似,當字段爲非 public 的時候,使用後者來獲取。

具體代碼如下:
Class cla = Class.forName( "UserClass.Person");
Field personName = cla.getField( "personName");

8. 通過反射獲取成員方法:
通過 getMethod() 和 getDeclaredMethod() 來獲取類中的成員方法,方法中的參數順序爲:成員方法名 , 成員方法中使用的參數(沒有則不輸入)。

兩者的區別:getDeclaredMethod() 能獲取非 public 成員方法。

具體代碼如下:

Class cla = Class.forName( "UserClass.Person");
Method personMethod = cla.getMethod( "personMethod");

9. 利用反射來使用配置文件,自己練習的代碼如下:

public void functionOne() throws Exception{

FileReader fr = new FileReader( "class.txt");
Properties pp = new Properties();
pp.load( fr);
fr.close();

String className = pp.getProperty( "className");
Stirng method = pp.getProperty( "method");

Class cla = Class.forName( className);
Constructor cons = cla.getConstructor();
Object obj = cons.newInstance();

Method methodShow = cla.getMethod( method);
methodShow.invoke( obj);
}

以下爲 class.txt 文件內容:
className=UserClass.Student
method=show

輸出結果爲: I am Teacher!!!

10. 在 List< Integer> list = new ArrayList< Integer>(); 中添加 字符串對象,自己練習的代碼如下:

public void functionTwo(){

List< Integer> list = new ArrayList< Integer>();
list.add( 123);

Class cla = Class.forName( ArrayList);
Method methodAdd = cla.getMethod( "add" , Object.class);
methodAdd.invoke( list , "xiaoTian");
methodAdd.invoke( list , "xiaoMing");

for( Iterator it = list.iterator ; it.hasNext() ; )
{
System.out.println( it.next());
}
}

輸出結果爲: 
123
xiaoTian
xiaoMing
發佈了39 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章