自定义class loader

上图为JDK 8中ClassLoader的族谱,可见除了总所周知的AppClassLoader和ExtClassLoader外,JDK中还有很多其它ClassLoader,既然这么多ClassLoader存在,也就不那么神秘了,那么如何自定义ClassLoader了?最简单的方式当然是继承现有的ClassLoader实现类,避免重复发明轮子,所以我们先了解一下ClassLoader类的实现。

findClass方法:这是自定义class loader类必须覆盖的方法,用于告诉class loader到哪里去加载类,比如某个目录或者JAR URL等。参数name为要加载的类全名,如java.lang.String。该方法作为类加载的步骤之一被loadClass()方法调用。

protectedClass<?>findClass(Stringname)throwsClassNotFoundException{thrownewClassNotFoundException(name);}

loadClass方法:这是classloader加载类的入口方法,觉得方法实现代码写得很够清晰就全贴出来了,附加一张简单的活动图辅助说明方法逻辑。

protectedClass<?>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{synchronized(getClassLoadingLock(name)){//First,checkiftheclasshasalreadybeenloadedClass<?>c=findLoadedClass(name);if(c==null){longt0=System.nanoTime();try{if(parent!=null){c=parent.loadClass(name,false);}else{c=findBootstrapClassOrNull(name);}}catch(ClassNotFoundExceptione){//ClassNotFoundExceptionthrownifclassnotfound//fromthenon-nullparentclassloader}if(c==null){//Ifstillnotfound,theninvokefindClassinorder//tofindtheclass.longt1=System.nanoTime();c=findClass(name);//thisisthedefiningclassloader;recordthestatssun.misc.PerfCounter.getParentDelegationTime().addTime(t1-t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if(resolve){resolveClass(c);}returnc;}}

getParent方法:用于获取class loader的parent,没有返回null。

publicfinalClassLoadergetParent()

findLoadedClass方法:返回已经加载的类。该方法直接调用本地方法实现。

protectedfinalClass<?>findLoadedClass(Stringname)

resolveClass方法:用于连接一个Class,,如果已经连接则什么都不做。该方法直接调用本地方法实现。

protectedfinalvoidresolveClass(Class<?>c)

切忌贪婪,恨不得一次玩遍所有传说中的好景点,

自定义class loader

相关文章:

你感兴趣的文章:

标签云: