publicclassA{static{System.out.println(".......static test A .............");}publicA(){System.out.println(".......public test A .............");}publicstaticvoidmain(String[] args){newA();System.out.println("........main Test .............");B b =null;}}classB{static{System.out.println(".......static test B .............");}publicB(){System.out.println(".............public test B............");}}
ClassLoader extcl;try{
extcl =ExtClassLoader.getExtClassLoader();}catch(IOException e){thrownewInternalError("Could not create extension class loader", e);}
returnAccessController.doPrivileged(newPrivilegedExceptionAction<ExtClassLoader>(){publicExtClassLoaderrun()throwsIOException{finalFile[] dirs =getExtDirs();int len = dirs.length;for(int i =0; i < len; i++){MetaIndex.registerDirectory(dirs[i]);}//主要new 的扩展类加载器 //扩展类加载器的父属性是引导类加载器//但引导类加载器是c/c++ 产生的,故而parent属性传null和不传一样returnnewExtClassLoader(dirs);}});
//调用父类将extClassLoader赋值到parent属性privateClassLoader(Void unused,ClassLoader parent){this.parent = parent;if(ParallelLoaders.isRegistered(this.getClass())){
parallelLockMap =newConcurrentHashMap<>();
package2certs =newConcurrentHashMap<>();
assertionLock =newObject();}else{// no finer-grained lock; lock on the classloader instance
parallelLockMap =null;
package2certs =newHashtable<>();
assertionLock =this;}}
类加载双亲委派机制
//ClassLoad.classprotectedClass<?>loadClass(String name,boolean resolve)throwsClassNotFoundException{synchronized(getClassLoadingLock(name)){// First, check if the class has already been loaded//尝试在类加载器里缓存查找是否已经加载Class<?> c =findLoadedClass(name);if(c ==null){try{if(parent !=null){//this类加载器缓存没有,就让父类加载
c = parent.loadClass(name,false);}else{
c =findBootstrapClassOrNull(name);}}catch(ClassNotFoundException e){}if(c ==null){//重要主要是类加载的过程
c =findClass(name);sun.misc.PerfCounter.getFindClasses().increment();}}if(resolve){resolveClass(c);}return c;}}
{finalClass<?> result;try{
result =AccessController.doPrivileged(newPrivilegedExceptionAction<Class<?>>(){publicClass<?>run()throwsClassNotFoundException{String path = name.replace('.','/').concat(".class");Resource res = ucp.getResource(path,false);if(res !=null){try{//TODO 进行类的加载过程returndefineClass(name, res);}catch(IOException e){thrownewClassNotFoundException(name, e);}}else{returnnull;}}}, acc);}catch(java.security.PrivilegedActionException pae){throw(ClassNotFoundException) pae.getException();}if(result ==null){thrownewClassNotFoundException(name);}return result;}
类加载loadClass 验证:主要验证字节码文件,如开头cafe babe 准备:初始化静态变量,定义常量 解析:符号引用指向直接引用,如main方法指向jvm内存区域 初始化:赋值静态变量,执行类的静态代码块 类加载思考:public class A { static { System.out.println(".......static test A ............."); } public A() { System.