反射機制:ClassLoader類載入器 和 reflect中的array使用
阿新 • • 發佈:2021-01-17
ClassLoader
載入、連線、初始化原理
載入以JVM程序為基本單位
1) 每個程式(public class方法都會開闢一個新的JVM程序;
故不同程式的記憶體不會共享(哪怕是靜態方法));
2)載入二進位制資料,來源有class檔案,jar包總class檔案,網路方法,java原始檔動態編譯 4種載入方法;
note:final修飾的類變數相對於“巨集變數”,java編碼器編譯時候已經替換完畢,不會有初始化問題(載入時候已經沒這個變量了)
3) boot的專業意思是開機、靴子; reboot重啟;重開啟;
bootstrap 開機繫結的(類),根xx; 比如java的bootstrap CL根類載入器;
類載入器種類
擴充套件、系統載入器都是 classLoader的子類;
根類載入器不是java實現的,但它其實也是擴充套件載入器的父類;
reflect總建立的array
/*通過java.lang.reflect下面的Array類,建立任意型別陣列、設定、獲取他們元素的值*/
import java.lang.reflect.Array;
public class P0107ReflectArray {
public static void main (String[] args) {
//1D string array
Object arr = Array.newInstance(String.class, 10);
Array.set(arr, 3, "pengfei");
Array.set(arr, 4,"Dengh");
Array.set(arr, 2, "zhirui");
System.out.println(Array.get(arr, 2) +
" " + Array.get(arr,3) +
" " + Array.get(arr, 4));
//3D string array
Object arr_3d = Array.newInstance(String.class, 2,3,4);
Object obtain_2d = Array.get(arr_3d, 1);// 3x4 array
Array.set(obtain_2d, 2, new String[] {
"fei", "rui","hui"
}); // 1x4 array [1][2][:]
Object obtain_1d = Array.get(obtain_2d, 0); // array[4]
Array.set(obtain_1d, 2, "We Are Family"); //[1][0][2]
String[][][] str_3d = (String [][][]) arr_3d;
//3loop output
for (String[][] s2: str_3d){
for (String[] s1: s2){
for (String s: s1) {
if (s != null) {
System.out.println(s + " ");
}
}
}
}
//index output
System.out.println(str_3d[1][0][2]);
System.out.println(str_3d[1][2][0] +
" " + str_3d[1][2][1] +
" " + str_3d[1][2][2]);
}
}
output
zhirui pengfei Dengh
We Are Family
fei
rui
hui
We Are Family
fei rui hui
Process finished with exit code 0