ClassLoader
加载、连接、初始化原理
加载以JVM进程为基本单位
1) 每个程序(public class方法都会开辟一个新的JVM进程;
故不同程序的内存不会共享(哪怕是静态方法));
2)加载二进制数据,来源有class文件,jar包总class文件,网络方法,java源文件动态编译 4种加载方法;
note:final修饰的类变量相对于“宏变量”,java编码器编译时候已经替换完毕,不会有初始化问题(加载时候已经没这个变量了)
3) boot的专业意思是开机、靴子; reboot重启;重开启;
bootstrap 开机绑定的(类),根xx; 比如java的bootstrap CL根类加载器;
这样ClassLoader类加载器,一开始就加载了类似 lib/rt.jar 运行时的核心类库(包括 String,System等);
类加载器种类
扩展、系统加载器都是 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