主è¦è´Ÿè´£java -classpath/-Djava.class.path所指的目录下的¾cÖM¸Žjar包装入工ä½?一般我们会(x¨¬)é…置环境å˜é‡classpathåQŒè¿™ä¸ªå°±æ˜¯è²å…¥classpath指定的èµ\径下jarå’Œclass,
òq›_¸¸æˆ‘们指定一ä¸?."åøP¼Œž®±æ˜¯æŒ‡å®šä»Žå½“å‰ç›®å½•下开始æœç´¢class¾c?parentä¸?Extension ClassLoader.
User Custom ClassLoader/ç”¨æˆ·è‡ªå®šä¹‰ç±»åŠ è²å™?java.lang.ClassLoaderçš„å¾c?
在程åºè¿è¡ŒæœŸé—? 通过java.lang.ClassLoaderçš„å¾cÕdŠ è½½classæ–‡äšg.
classloaderè¦åŠ è½½class先从底å‘ä¸Šä¼ é€’ç»™çˆ¶äº²åŠ è²¾c»ï¼Œæœ€™å¶å±‚çš„classloaderå¦‚æžœèƒ½å¤ŸåŠ è²ž®±åŠ è½½è¿›æ¥ï¼Œä¸è¡Œçš„è¯åQŒå°±è‡ªä¸Šè€Œä¸‹ä¼ 递,åªåˆ°ä¸€ä¸ªclassloaderèƒ½è¿›è¡Œç±»çš„åŠ è½½ï¼Œ
如果没有一个classloaderèƒ½åŠ è½½çš„è¯ï¼Œž®×ƒ¼š(x¨¬)抛出ClassNotFoundException或者NoClassDefFoundError异常åQŒè¿™ä¸ªå°±æ˜¯åŒäº²å§”‹z¾æ¨¡å¼?br />
classloader˜q™ç§æ¨¡å¼ä¿è¯äº†ä¸åŒçš„classloader之间¾cÖM¸ä¼?x¨¬)相互的影å“åQŒé‚£ä¹ˆä¹Ÿä¿è¯äº†å¥½çš„ç±»ä¸ä¼š(x¨¬)è¢«æ¶æ„çš„¾cÀL‰€ç ´ååQŒè¿™ä¸ªä¹Ÿæ˜¯jvm沙箱模å¼å®‰å…¨çš„一个ä¿è¯?br />
在ä¸åŒclassloaderçš„åŒåçš„¾cÕd®žä¾‹ä¸èƒ½äº’相沟通,¾cÕdž‹è½¬æ¢åQŒinstanceofåQŒå¦‚æžœè¿™æ ·åšåQŒåˆ™ä¼?x¨¬)抛出ClassCastException.所以抛出ClassCastExceptionçš„åŽŸå› ä¸æ¢å’Œ¾l§æ‰¿åQŒå®žçŽ°æœ‰å…³ç³»åQ?br />˜q˜å’Œclassloader有关¾p?
当è¿è¡Œæ—¶å‘现一个新classè¦loadæ—Óž¼Œé™¤ä»£ç 已指定由哪classloader的实例load外,先由调用者的classloader所在的classloader tree去loadåQŒå¦‚æžœsuper¾c?interface¾cÕd¯¹äºŽè¿™ä¸ªæ ‘(w¨¨i)是新的也一起会(x¨¬)被load。这是caller classloader的概å¿?
åŒäº²å§”æ´¾å¯ä»¥è¢«æ‰“ç ß_(d¨¢)¼Œå…¨æƒè´Ÿè´£ä¹Ÿå¯è¢«æ‰“ç ß_(d¨¢)¼Œæ‰€ä»¥è¿è¡Œæ—¶å†›_®š¾cÀL¥è‡ªå“ªé‡Œï¼Œ˜q˜æ˜¯ç”±classloaderæ ?w¨¨i)å’Œload classçš„ä»£ç æ˜¯æ€Žæ ·è€Œå†³å®šã€?br />
Thread Context ClassLoaderåQšçº¿½E‹ä¸Šä¸‹æ–‡classloaderåQŒæ˜¯holdä½äº†ä¸€ClassLoader的实例,˜q™ä¸ªholder在线½E‹è¿è¡Œæµ½E‹é‡Œå¯ä»¥åˆ°è¾¾éšå¼ä¼ 递classloader。这个classloader是一个ä¸ä¼?x¨¬)主动load的实例,ž®±æ˜¯è¯´åœ¨˜q™ä¸ª¾U¿ç¨‹˜q行下é‡åˆ°æ–°¾c»è¿™ä¸ªclassloaderä¸ä¼š(x¨¬)ä¸ÕdŠ¨åŽ»loadåQŒåªæœ‰è‡ªå·Þq”¨æ˜‘Ö¼ä»£ç æˆ–ä½ çœ‹ä¸è§çš„jar里用昑ּ代ç 用这ä¸?div>classloader loadClass()或Class.forName()åQŒæ‰ä¼?x¨¬)ç”Ÿæ•ˆã€‚å› æ¤ï¼Œcaller classloaderå’?thread context classloaderåQŒåœ¨æ‰§è¡ŒåˆîC½ çš„ä»£ç æ—¶åQŒå·²å®šã€‚åÆˆä¸”æ‰§è¡Œæµ½E‹çš„ä¸åŒåQŒåˆ°ä½ ä»£ç æ—¶çš„å…¥å£ä¹Ÿä¸åŒåQŒè¢«æ”„¡½®å…¥threadçš„thread context classloaderå’ŒCaller ClassLoaderä¸ä¸€å®šä¸€æ øP¼Œå› æ¤æ˜¯ä¸½E›_®šçš?br />
需è¦ç¨³å®šçš„è¯ï¼Œž®Þp¦ä¿è¯åœ¨è®¾è®¡æ—¶ž®Þp€ƒè™‘到儿Uå…¥å£å’Œç”¨æ³•的情况,然åŽå¾—到¼‹®å®šçš„classloaderå˜åœ¨ thread context classloader或者第三方的class loaderä¸ï¼Œtomcatçš„ç±»åŠ è²ä½“ç³»ž®±æ˜¯˜q™æ ·åšçš„.