一、JAVA程序运行的过程
Java程序运行过程,首先假设我们有一个xxx.Class文件,
那个这个class文件首先会被classloader将其load到内存中的codeSegment区域中,
那么站在classloader的角度来看的话,那个这里面的一个个的class就是一个对象,
这个对象是什么对象呢,就是xxx.class 实际上就是那个class的对象
然后loader的class找到main开始执行,运行过程中会有好多其他的class被load到内存,因为动态加载机制
class并不是一次性全部加载,而是运行到了才去加载,配置java运行在VM argus中设置-veverbose:class可以看到类的具体加载过程;static语句块在加载后只执行一次,相反的其他,每次new的是时候都会加载
二、JDK中内置了很多个ClassLoader,
其中核心的是bootstrap class loader,
还有extension class loader 它负责loader the class from jre/lib/ext 文件下在jar,他负责jdk的扩展类
application class loader 他负责loader用户定义的class,这个loader可以通过ClassLoader.getSystemClassLoader()获得
还有一个其他的classloader可以通过classloader的集成去查找
其大概的顺序是bootstrap loader 加载 extension loader 加载 application loader 加载其他 loader
//测试上述的执行顺序
//可以理解成是哪个classloader加载的这个class
ClassLoader c = TestClassLoader.class.getClassLoader();
while(c != null){
System.out.println(c.getClass().getName());
//getParent是这个对象有一个引用指向的extesionClassloader的对象,并不是继承
c = c.getParent();
}
二、反射测试程序
package com.ws.classloader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestReflection {
public static void main(String[] args) {
try {
// 首先加载T到内存 注意使用forname的时候其中的参数(class)必须指定到包名,
// java.lang.ClassNotFoundException Class.forName()不然那报错
String str = "com.ws.classloader.T";
Class c = Class.forName(str);
// 然后创建T的实例
Object TnewInstance = c.newInstance();
Method[] methods = c.getMethods();
for (Method m : methods) {
if (m.getName().equals("m2")) {
m.invoke(TnewInstance);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
package com.ws.classloader;
class T {
public String a;
public int b;
// 静态代码去loader值加载一次
static {
System.out.println("T Loader 动态代码块加载..");
}
public T() {
System.out.println("T constructed 无参数构造方法加载~!");
}
public void m2() {
System.out.println("m2 invoked 自定义方法m2加载");
}
public void m1(String a) {
this.a = a;
}
public int getB() {
return b;
}
}