1. 程式人生 > >Java : java基礎(6) 反射與枚舉

Java : java基礎(6) 反射與枚舉

解析 ext tac ssi 構造 oot 三種 spa style

類需要經過 加載, 連接, 初始化三個步驟來進行初始化. 加載是把class文件讀入內存創建一個class對象, 連接分為三步,第一步是驗證是否是正確的結構, 第二步是準備, 為類的靜態成員分配內存,初始化默認值, 第三步是解析, 將類的二進制數據中的符號替換為直接引用.初始化是靜態代碼塊,構造代碼塊等的執行等.

類加載器有三種, Bootstrap引導類加載器, 負責java核心類的加載,如 System String等(在rt.jar文件中). Extention擴展類加載器, 負責jre擴展目錄中的jar包的加載, 在jre的lib目錄下的ext目錄. System系統類(也叫應用類)加載器,負責來自java命令的class文件及環境變量中的jar包和類路徑

類的反射在字節碼文件階段(X.class文件)的獲取方式為 class.forName("類名"), 在加載到jvm之後字節碼階段(X.class)獲取的方式為 X.class, 在創建對象之後獲取的方式為 x.getClass()

反射得到的類獲取一個新實例為 clazz.newInstance() 不可以傳入參數, 有參構造可以通過Constructor c = clazz.getConstructor(String.class, int.class) 獲取構造函數,然後用c.newInstance("xxx", 1)來創建對象. 通過Field f = clazz.getField()獲取單個成員變量,通過getFields()獲取所有成員變量,私有的屬性可以通過調用getDeclaedField()獲取私有屬性,然後用f.setAccessible(true)去除私有權限,就可以用f.set(對象, 修改值) 來修改某個對象的f屬性的值

獲取方法可以用 clazz.getMethod("xxx", int.class) 基本和獲取屬性差不多,後面是需要傳參的參數的類型, 可以用Method.invoke(對象, 參數) 調用對象的method方法.

枚舉是把所有有限的變量都列出來, 如一年有12個月, 一周有七天等, 單例類是只有一個實例, 多例類就是有有限個數的多個實例,如枚舉類.

最簡單的枚舉類: (枚舉項必須放在枚舉類的第一行, 枚舉類的構造函數必須而且是默認私有的, 枚舉類可以在switch裏面使用)

public enum Week {
MON, TUE, WED;
}

使用構造方法的方式: (可以用getName獲取名字,可以給枚舉類的實例加一些字段,方法等,對枚舉類進行擴展)

public enum Week {
MON("周一"), TUE("周二"), WED("周三");

private String name;

private Week(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

Java : java基礎(6) 反射與枚舉