### Java CLassLoader ç±»å è½½å¨ï¼class loaderï¼æ¯ Javaâ¢ä¸çä¸ä¸ªå¾éè¦çæ¦å¿µãç±»å è½½å¨è´è´£å è½½ Java ç±»çåè代ç å° Java èææºä¸ãæ¬æé¦å 详ç»ä»ç»äº Java ç±»å è½½å¨çåºæ¬æ¦å¿µï¼å æ¬ä»£ç模å¼ãå 载类çå ·ä½è¿ç¨å线ç¨ä¸ä¸æç±»å è½½å¨çï¼æ¥çä»ç»å¦ä½å¼åèªå·±çç±»å è½½å¨ï¼æåä»ç»äºç±»å è½½å¨å¨ Web 容å¨å OSGiâ¢ä¸çåºç¨ã ç±»å è½½å¨æ¯ Java è¯è¨çä¸ä¸ªåæ°ï¼ä¹æ¯ Java è¯è¨æµè¡çéè¦åå ä¹ä¸ãå®ä½¿å¾ Java ç±»å¯ä»¥è¢«å¨æå è½½å° Java èææºä¸å¹¶æ§è¡ãç±»å è½½å¨ä» JDK 1.0 å°±åºç°äºï¼æåæ¯ä¸ºäºæ»¡è¶³ Java Applet çéè¦èå¼ååºæ¥çãJava Applet éè¦ä»è¿ç¨ä¸è½½ Java ç±»æä»¶å°æµè§å¨ä¸å¹¶æ§è¡ãç°å¨ç±»å è½½å¨å¨ Web 容å¨å OSGi ä¸å¾å°äºå¹¿æ³ç使ç¨ãä¸è¬æ¥è¯´ï¼Java åºç¨çå¼å人åä¸éè¦ç´æ¥åç±»å è½½å¨è¿è¡äº¤äºãJava èææºé»è®¤çè¡ä¸ºå°±å·²ç»è¶³å¤æ»¡è¶³å¤§å¤æ°æ åµçéæ±äºãä¸è¿å¦æéå°äºéè¦ä¸ç±»å è½½å¨è¿è¡äº¤äºçæ åµï¼è对类å è½½å¨çæºå¶å䏿¯å¾äºè§£çè¯ï¼å°±å¾å®¹æè±å¤§éçæ¶é´å»è°è¯ ClassNotFoundExceptionåNoClassDefFoundErrorçå¼å¸¸ãæ¬æå°è¯¦ç»ä»ç» Java çç±»å è½½å¨ï¼å¸®å©è¯»è æ·±å»çè§£ Java è¯è¨ä¸çè¿ä¸ªéè¦æ¦å¿µãä¸é¢é¦å ä»ç»ä¸äºç¸å ³çåºæ¬æ¦å¿µã **ç±»çå è½½è¿ç¨** JVMå°ç±»å è½½è¿ç¨å为ä¸ä¸ªæ¥éª¤ï¼è£ è½½ï¼Loadï¼ï¼é¾æ¥ï¼Linkï¼ååå§å(Initialize)龿¥åå为ä¸ä¸ªæ¥éª¤ï¼å¦ä¸å¾æç¤ºï¼  1) è£ è½½ï¼æ¥æ¾å¹¶å 载类çäºè¿å¶æ°æ®ï¼ 2)龿¥ï¼ éªè¯ï¼ç¡®ä¿è¢«å è½½ç±»çæ£ç¡®æ§ï¼ åå¤ï¼ä¸ºç±»çéæåéåé å åï¼å¹¶å°å ¶åå§å为é»è®¤å¼ï¼ è§£æï¼æç±»ä¸ç符å·å¼ç¨è½¬æ¢ä¸ºç´æ¥å¼ç¨ï¼ 3)åå§åï¼ä¸ºç±»çéæåéèµäºæ£ç¡®çåå§å¼ï¼ é£ä¸ºä»ä¹æè¦æéªè¯è¿ä¸æ¥éª¤å¢ï¼é¦å 妿ç±ç¼è¯å¨çæçclassæä»¶ï¼å®è¯å®æ¯ç¬¦åJVMåèç æ ¼å¼çï¼ä½æ¯ä¸ä¸æé«æèªå·±åä¸ä¸ªclassæä»¶ï¼è®©JVMå 载并è¿è¡ï¼ç¨äºæ¶æç¨éï¼å°±ä¸å¦äºï¼å æ¤è¿ä¸ªclassæä»¶è¦å è¿éªè¯è¿ä¸å ³ï¼ä¸ç¬¦åçè¯ä¸ä¼è®©å®ç»§ç»æ§è¡çï¼ä¹æ¯ä¸ºäºå®å ¨èèå§ã åå¤é¶æ®µååå§åé¶æ®µçä¼¼æç¹çç¾ï¼å ¶å®æ¯ä¸çç¾çï¼å¦æç±»ä¸æè¯å¥ï¼private static int a = 10ï¼å®çæ§è¡è¿ç¨æ¯è¿æ ·çï¼é¦å åèç æä»¶è¢«å è½½å°å ååï¼å è¿è¡é¾æ¥çéªè¯è¿ä¸æ¥éª¤ï¼éªè¯éè¿ååå¤é¶æ®µï¼ç»aåé å åï¼å 为åéaæ¯staticçï¼æä»¥æ¤æ¶açäºintç±»åçé»è®¤åå§å¼0ï¼å³a=0,ç¶åå°è§£æï¼åé¢å¨è¯´ï¼ï¼å°åå§åè¿ä¸æ¥éª¤æ¶ï¼ææaççæ£çå¼10èµç»a,æ¤æ¶a=10ã **ç±»çåå§å** ç±»ä»ä¹æ¶åæè¢«åå§åï¼ * 1ï¼å建类çå®ä¾ï¼ä¹å°±æ¯newä¸ä¸ªå¯¹è±¡ * 2ï¼è®¿é®æä¸ªç±»ææ¥å£çéæåéï¼æè 对该éæåéèµå¼ * 3ï¼è°ç¨ç±»çéææ¹æ³ * 4ï¼åå°ï¼Class.forName("com.lyj.load")ï¼ * 5ï¼åå§åä¸ä¸ªç±»çåç±»ï¼ä¼é¦å åå§ååç±»çç¶ç±»ï¼ * 6ï¼JVMå¯å¨æ¶æ æçå¯å¨ç±»ï¼å³æä»¶ååç±»åç¸åçé£ä¸ªç±» åªæè¿6䏿 嵿ä¼å¯¼è´ç±»çç±»çåå§åã ç±»çåå§åæ¥éª¤ï¼ 1ï¼å¦æè¿ä¸ªç±»è¿æ²¡æè¢«å è½½å龿¥ï¼é£å è¿è¡å è½½å龿¥ 2ï¼åå¦è¿ä¸ªç±»åå¨ç´æ¥ç¶ç±»ï¼å¹¶ä¸è¿ä¸ªç±»è¿æ²¡æè¢«åå§åï¼æ³¨æï¼å¨ä¸ä¸ªç±»å è½½å¨ä¸ï¼ç±»åªè½åå§å䏿¬¡ï¼ï¼é£å°±åå§åç´æ¥çç¶ç±»ï¼ä¸éç¨äºæ¥å£ï¼ 3)å å ¥ç±»ä¸åå¨åå§åè¯å¥ï¼å¦staticåéåstaticåï¼ï¼é£å°±ä¾æ¬¡æ§è¡è¿äºåå§åè¯å¥ã **ç±»çå è½½** ç±»çå è½½æçæ¯å°ç±»ç.classæä»¶ä¸çäºè¿å¶æ°æ®è¯»å ¥å°å åä¸ï¼å°å ¶æ¾å¨è¿è¡æ¶æ°æ®åºçæ¹æ³åºå ï¼ç¶åå¨å åºå建ä¸ä¸ªè¿ä¸ªç±»çjava.lang.Class对象ï¼ç¨æ¥å°è£ ç±»å¨æ¹æ³åºç±»ç对象ãçä¸é¢å¾   ç±»çå è½½çæç»äº§åæ¯ä½äºå åºä¸çClass对象 Class对象å°è£ äºç±»å¨æ¹æ³åºå çæ°æ®ç»æï¼å¹¶ä¸åJavaç¨åºåæä¾äºè®¿é®æ¹æ³åºå çæ°æ®ç»æçæ¥å£ å è½½ç±»çæ¹å¼æä»¥ä¸å ç§ï¼ 1ï¼ä»æ¬å°ç³»ç»ç´æ¥å è½½ 2ï¼éè¿ç½ç»ä¸è½½.classæä»¶ 3ï¼ä»zipï¼jarç彿¡£æä»¶ä¸å è½½.classæä»¶ 4ï¼ä»ä¸ææ°æ®åºä¸æå.classæä»¶ 5ï¼å°Javaæºæä»¶å¨æç¼è¯ä¸º.classæä»¶ï¼æå¡å¨ï¼ **ç±»å è½½å¨åºæ¬æ¦å¿µ** 顾åæä¹ï¼ç±»å è½½å¨ï¼class loaderï¼ç¨æ¥å è½½ Java ç±»å° Java èææºä¸ãä¸è¬æ¥è¯´ï¼Java èææºä½¿ç¨ Java ç±»çæ¹å¼å¦ä¸ï¼Java æºç¨åºï¼.java æä»¶ï¼å¨ç»è¿ Java ç¼è¯å¨ç¼è¯ä¹åå°±è¢«è½¬æ¢æ Java åè代ç ï¼.class æä»¶ï¼ãç±»å è½½å¨è´è´£è¯»å Java åè代ç ï¼å¹¶è½¬æ¢æjava.lang.Classç±»çä¸ä¸ªå®ä¾ãæ¯ä¸ªè¿æ ·çå®ä¾ç¨æ¥è¡¨ç¤ºä¸ä¸ª Java ç±»ãéè¿æ¤å®ä¾ç newInstance()æ¹æ³å°±å¯ä»¥å建åºè¯¥ç±»çä¸ä¸ªå¯¹è±¡ãå®é çæ åµå¯è½æ´å å¤æï¼æ¯å¦ Java åè代ç å¯è½æ¯éè¿å·¥å ·å¨æçæçï¼ä¹å¯è½æ¯éè¿ç½ç»ä¸è½½çã **å è½½å¨** æ¥èª[http://blog.csdn.net/cutesource/article/details/5904501](http://blog.csdn.net/cutesource/article/details/5904501) JVMçç±»å è½½æ¯éè¿ClassLoaderåå ¶åç±»æ¥å®æçï¼ç±»ç屿¬¡å ³ç³»åå 载顺åºå¯ä»¥ç±ä¸å¾æ¥æè¿°ï¼  1ï¼Bootstrap ClassLoader è´è´£å è½½$JAVA_HOMEä¸jre/lib/rt.jaréææçclassï¼ç±C++å®ç°ï¼ä¸æ¯ClassLoaderåç±» 2ï¼Extension ClassLoader è´è´£å è½½javaå¹³å°ä¸æ©å±åè½çä¸äºjarå ï¼å æ¬$JAVA_HOMEä¸jre/lib/*.jaræ-Djava.ext.dirsæå®ç®å½ä¸çjarå 3ï¼App ClassLoader è´è´£è®°è½½classpath䏿å®çjarå åç®å½ä¸class 4ï¼Custom ClassLoader å±äºåºç¨ç¨åºæ ¹æ®èªèº«éè¦èªå®ä¹çClassLoaderï¼å¦tomcatãjbossé½ä¼æ ¹æ®j2eeè§èèªè¡å®ç°ClassLoader å è½½è¿ç¨ä¸ä¼å æ£æ¥ç±»æ¯å¦è¢«å·²å è½½ï¼æ£æ¥é¡ºåºæ¯èªåºåä¸ï¼ä»Custom ClassLoaderå°BootStrap ClassLoaderé屿£æ¥ï¼åªè¦æä¸ªclassloaderå·²å 载就è§ä¸ºå·²å è½½æ¤ç±»ï¼ä¿è¯æ¤ç±»åªææ ClassLoaderå è½½ä¸æ¬¡ãèå è½½çé¡ºåºæ¯èªé¡¶åä¸ï¼ä¹å°±æ¯ç±ä¸å±æ¥éå±å°è¯å è½½æ¤ç±»ã åºæ¬ä¸ææçç±»å è½½å¨é½æ¯ java.lang.ClassLoaderç±»çä¸ä¸ªå®ä¾ãä¸é¢è¯¦ç»ä»ç»è¿ä¸ª Java ç±»ã **java.lang.ClassLoaderç±»ä»ç»** java.lang.ClassLoaderç±»çåºæ¬èè´£å°±æ¯æ ¹æ®ä¸ä¸ªæå®çç±»çåç§°ï¼æ¾å°æè çæå ¶å¯¹åºçåè代ç ï¼ç¶åä»è¿äºåè代ç ä¸å®ä¹åºä¸ä¸ª Java ç±»ï¼å³ java.lang.Classç±»çä¸ä¸ªå®ä¾ã餿¤ä¹å¤ï¼ClassLoaderè¿è´è´£å è½½ Java åºç¨æéçèµæºï¼å¦å¾åæä»¶åé ç½®æä»¶çãä¸è¿æ¬æåªè®¨è®ºå ¶å 载类çåè½ã为äºå®æå 载类çè¿ä¸ªèè´£ï¼ClassLoaderæä¾äºä¸ç³»åçæ¹æ³ï¼æ¯è¾éè¦çæ¹æ³å¦ 表 1æç¤ºãå ³äºè¿äºæ¹æ³çç»èä¼å¨ä¸é¢è¿è¡ä»ç»ã * getParent() è¿å该类å è½½å¨çç¶ç±»å è½½å¨ã * loadClass(String name) å è½½å称为 nameçç±»ï¼è¿åçç»ææ¯ java.lang.Classç±»çå®ä¾ã * findClass(String name) æ¥æ¾å称为 nameçç±»ï¼è¿åçç»ææ¯ java.lang.Classç±»çå®ä¾ã * findLoadedClass(String name) æ¥æ¾å称为 nameçå·²ç»è¢«å è½½è¿çç±»ï¼è¿åçç»ææ¯ java.lang.Classç±»çå®ä¾ã * defineClass(String name, byte[] b, int off, int len) æåèæ°ç» bä¸çå å®¹è½¬æ¢æ Java ç±»ï¼è¿åçç»ææ¯ java.lang.Classç±»çå®ä¾ãè¿ä¸ªæ¹æ³è¢«å£°æä¸º finalçã * resolveClass(Class> c) 龿¥æå®ç Java ç±»ã å¯¹äº è¡¨ 1ä¸ç»åºçæ¹æ³ï¼è¡¨ç¤ºç±»åç§°ç nameåæ°ç弿¯ç±»çäºè¿å¶åç§°ãéè¦æ³¨æçæ¯å é¨ç±»ç表示ï¼å¦ com.example.Sample$1åcom.example.Sample$Innerç表示æ¹å¼ãè¿äºæ¹æ³ä¼å¨ä¸é¢ä»ç»ç±»å è½½å¨ç工使ºå¶æ¶ï¼åè¿ä¸æ¥ç说æãä¸é¢ä»ç»ç±»å è½½å¨çæ ç¶ç»ç»ç»æã **ç±»å è½½å¨çæ ç¶ç»ç»ç»æ** Java ä¸çç±»å è½½å¨å¤§è´å¯ä»¥åæä¸¤ç±»ï¼ä¸ç±»æ¯ç³»ç»æä¾çï¼å¦å¤ä¸ç±»åæ¯ç± Java åºç¨å¼å人åç¼åçãç³»ç»æä¾çç±»å è½½å¨ä¸»è¦æä¸é¢ä¸ä¸ªï¼ * å¼å¯¼ç±»å è½½å¨ï¼bootstrap class loaderï¼ï¼å®ç¨æ¥å è½½ Java çæ ¸å¿åºï¼æ¯ç¨åçä»£ç æ¥å®ç°çï¼å¹¶ä¸ç»§æ¿èª java.lang.ClassLoaderã * æ©å±ç±»å è½½å¨ï¼extensions class loaderï¼ï¼å®ç¨æ¥å è½½ Java çæ©å±åºãJava èææºçå®ç°ä¼æä¾ä¸ä¸ªæ©å±åºç®å½ã该类å è½½å¨å¨æ¤ç®å½é颿¥æ¾å¹¶å è½½ Java ç±»ã * ç³»ç»ç±»å è½½å¨ï¼system class loaderï¼ï¼å®æ ¹æ® Java åºç¨ç类路å¾ï¼CLASSPATHï¼æ¥å è½½ Java ç±»ãä¸è¬æ¥è¯´ï¼Java åºç¨çç±»é½æ¯ç±å®æ¥å®æå è½½çãå¯ä»¥éè¿ ClassLoader.getSystemClassLoader()æ¥è·åå®ã é¤äºç³»ç»æä¾çç±»å è½½å¨ä»¥å¤ï¼å¼å人åå¯ä»¥éè¿ç»§æ¿ java.lang.ClassLoaderç±»çæ¹å¼å®ç°èªå·±çç±»å è½½å¨ï¼ä»¥æ»¡è¶³ä¸äºç¹æ®çéæ±ã é¤äºå¼å¯¼ç±»å è½½å¨ä¹å¤ï¼ææçç±»å è½½å¨é½æä¸ä¸ªç¶ç±»å è½½å¨ãéè¿ è¡¨ 1ä¸ç»åºç getParent()æ¹æ³å¯ä»¥å¾å°ã对äºç³»ç»æä¾çç±»å è½½å¨æ¥è¯´ï¼ç³»ç»ç±»å è½½å¨çç¶ç±»å è½½å¨æ¯æ©å±ç±»å è½½å¨ï¼èæ©å±ç±»å è½½å¨çç¶ç±»å è½½å¨æ¯å¼å¯¼ç±»å è½½å¨ï¼å¯¹äºå¼å人åç¼åçç±»å è½½å¨æ¥è¯´ï¼å ¶ç¶ç±»å è½½å¨æ¯å è½½æ¤ç±»å è½½å¨ Java ç±»çç±»å è½½å¨ãå 为类å è½½å¨ Java ç±»å¦åå ¶å®ç Java ç±»ä¸æ ·ï¼ä¹æ¯è¦ç±ç±»å è½½å¨æ¥å è½½çãä¸è¬æ¥è¯´ï¼å¼å人åç¼åçç±»å è½½å¨çç¶ç±»å è½½å¨æ¯ç³»ç»ç±»å è½½å¨ãç±»å è½½å¨éè¿è¿ç§æ¹å¼ç»ç»èµ·æ¥ï¼å½¢ææ ç¶ç»æãæ çæ ¹èç¹å°±æ¯å¼å¯¼ç±»å è½½å¨ãå¾ 1ä¸ç»åºäºä¸ä¸ªå ¸åçç±»å è½½å¨æ ç¶ç»ç»ç»æç¤ºæå¾ï¼å ¶ä¸çç®å¤´æåçæ¯ç¶ç±»å è½½å¨ã ç±»å è½½å¨æ ç¶ç»ç»ç»æç¤ºæå¾  æ¼ç¤ºç±»å è½½å¨çæ ç¶ç»ç»ç»æ public class ClassLoaderTree { public static void main(String[] args) { ClassLoader loader = ClassLoaderTree.class.getClassLoader(); while (loader != null) { System.out.println(loader.toString()); loader = loader.getParent(); } } } æ¯ä¸ª Java ç±»é½ç»´æ¤çä¸ä¸ªæåå®ä¹å®çç±»å è½½å¨çå¼ç¨ï¼éè¿ getClassLoader()æ¹æ³å°±å¯ä»¥è·åå°æ¤å¼ç¨ãä»£ç æ¸ å 1ä¸éè¿éå½è°ç¨getParent()æ¹æ³æ¥è¾åºå ¨é¨çç¶ç±»å è½½å¨ãä»£ç æ¸ å 1çè¿è¡ç»æå¦ ä»£ç æ¸ å 2æç¤ºã æ¼ç¤ºç±»å è½½å¨çæ ç¶ç»ç»ç»æçè¿è¡ç»æ sun.misc.Launcher$AppClassLoader@9304b1 sun.misc.Launcher$ExtClassLoader@190d11 å¦ ä»£ç æ¸ åæç¤ºï¼ç¬¬ä¸ä¸ªè¾åºçæ¯ ClassLoaderTreeç±»çç±»å è½½å¨ï¼å³ç³»ç»ç±»å è½½å¨ã宿¯ sun.misc.Launcher$AppClassLoaderç±»çå®ä¾ï¼ç¬¬äºä¸ªè¾åºçæ¯æ©å±ç±»å è½½å¨ï¼æ¯ sun.misc.Launcher$ExtClassLoaderç±»çå®ä¾ãéè¦æ³¨æçæ¯è¿é并没æè¾åºå¼å¯¼ç±»å è½½å¨ï¼è¿æ¯ç±äºæäº JDK çå®ç°å¯¹äºç¶ç±»å è½½å¨æ¯å¼å¯¼ç±»å è½½å¨çæ åµï¼getParent()æ¹æ³è¿å nullã å¨äºè§£äºç±»å è½½å¨çæ ç¶ç»ç»ç»æä¹åï¼ä¸é¢ä»ç»ç±»å è½½å¨çä»£çæ¨¡å¼ã **ç±»å è½½å¨çä»£çæ¨¡å¼** ç±»å è½½å¨å¨å°è¯èªå·±å»æ¥æ¾æä¸ªç±»çåè代ç å¹¶å®ä¹å®æ¶ï¼ä¼å 代çç»å ¶ç¶ç±»å è½½å¨ï¼ç±ç¶ç±»å è½½å¨å å»å°è¯å è½½è¿ä¸ªç±»ï¼ä¾æ¬¡ç±»æ¨ãå¨ä»ç»ä»£ç模å¼èåç卿ºä¹åï¼é¦å éè¦è¯´æä¸ä¸ Java èææºæ¯å¦ä½å¤å®ä¸¤ä¸ª Java ç±»æ¯ç¸åçãJava èææºä¸ä» è¦çç±»çå ¨åæ¯å¦ç¸åï¼è¿è¦çå è½½æ¤ç±»çç±»å è½½å¨æ¯å¦ä¸æ ·ãåªæä¸¤è é½ç¸åçæ åµï¼æè®¤ä¸ºä¸¤ä¸ªç±»æ¯ç¸åçãå³ä¾¿æ¯åæ ·çåè代ç ï¼è¢«ä¸åçç±»å è½½å¨å è½½ä¹åæå¾å°çç±»ï¼ä¹æ¯ä¸åçãæ¯å¦ä¸ä¸ª Java ç±» com.example.Sampleï¼ç¼è¯ä¹åçæäºåèä»£ç æä»¶ Sample.classã两个ä¸åçç±»å è½½å¨ClassLoaderAå ClassLoaderBåå«è¯»åäºè¿ä¸ª Sample.classæä»¶ï¼å¹¶å®ä¹åºä¸¤ä¸ª java.lang.Classç±»çå®ä¾æ¥è¡¨ç¤ºè¿ä¸ªç±»ãè¿ä¸¤ä¸ªå®ä¾æ¯ä¸ç¸åçãå¯¹äº Java èææºæ¥è¯´ï¼å®ä»¬æ¯ä¸åçç±»ãè¯å¾å¯¹è¿ä¸¤ä¸ªç±»ç对象è¿è¡ç¸äºèµå¼ï¼ä¼æåºè¿è¡æ¶å¼å¸¸ClassCastExceptionãä¸é¢éè¿ç¤ºä¾æ¥å ·ä½è¯´æãä»£ç æ¸ å 3ä¸ç»åºäº Java ç±» com.example.Sampleã Sample ç±» public class Sample { private Sample instance; public void setSample(Object instance) { this.instance = (Sample) instance; } } Sampleç±»çæ¹æ³ setSampleæ¥åä¸ä¸ª java.lang.Objectç±»åçåæ°ï¼å¹¶ä¸ä¼æè¯¥åæ°å¼ºå¶è½¬æ¢æSampleç±»åãæµè¯ Java ç±»æ¯å¦ç¸åç代ç å¦æç¤ºã æµè¯ Java ç±»æ¯å¦ç¸å public void testClassIdentity() { String classDataRootPath = "C:\\workspace\\Classloader\\classData"; FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath); FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath); String className = "com.example.Sample"; try { Class> class1 = fscl1.loadClass(className); Object obj1 = class1.newInstance(); Class> class2 = fscl2.loadClass(className); Object obj2 = class2.newInstance(); Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class); setSampleMethod.invoke(obj1, obj2); } catch (Exception e) { e.printStackTrace(); } } ä»£ç æ¸ å 4ä¸ä½¿ç¨äºç±» FileSystemClassLoaderç两个ä¸åå®ä¾æ¥åå«å 载类 Sampleï¼å¾å°äºä¸¤ä¸ªä¸åçjava.lang.Classçå®ä¾ï¼æ¥çéè¿ newInstance()æ¹æ³åå«çæäºä¸¤ä¸ªç±»ç对象 obj1å obj2ï¼æåéè¿ Java çåå° API å¨å¯¹è±¡ obj1ä¸è°ç¨æ¹æ³ setSampleï¼è¯å¾æå¯¹è±¡ obj2èµå¼ç» obj1å é¨ç instance对象ãä»£ç æ¸ å 4çè¿è¡ç»æå¦ ä»£ç æ¸ å 5æç¤ºã æµè¯ Java ç±»æ¯å¦ç¸åçè¿è¡ç»æ package com.example; public class Sample { private Sample instance; public void setSample(Object instance) { this.instance = (Sample) instance; } } å¦ ä»£ç æ¸ å 3æç¤ºï¼com.example.Sampleç±»çæ¹æ³ setSampleæ¥åä¸ä¸ª java.lang.Objectç±»åçåæ°ï¼å¹¶ä¸ä¼æè¯¥åæ°å¼ºå¶è½¬æ¢æcom.example.Sampleç±»åãæµè¯ Java ç±»æ¯å¦ç¸åç代ç å¦ ä»£ç æ¸ å 4æç¤ºã æµè¯ Java ç±»æ¯å¦ç¸å public void testClassIdentity() { String classDataRootPath = "C:\\workspace\\Classloader\\classData"; FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath); FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath); String className = "com.example.Sample"; try { Class> class1 = fscl1.loadClass(className); Object obj1 = class1.newInstance(); Class> class2 = fscl2.loadClass(className); Object obj2 = class2.newInstance(); Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class); setSampleMethod.invoke(obj1, obj2); } catch (Exception e) { e.printStackTrace(); } } ä»£ç æ¸ å 4ä¸ä½¿ç¨äºç±» FileSystemClassLoaderç两个ä¸åå®ä¾æ¥åå«å 载类com.example.Sampleï¼å¾å°äºä¸¤ä¸ªä¸åçjava.lang.Classçå®ä¾ï¼æ¥çéè¿ newInstance()æ¹æ³åå«çæäºä¸¤ä¸ªç±»ç对象 obj1å obj2ï¼æåéè¿ Java çåå° API å¨å¯¹è±¡ obj1ä¸è°ç¨æ¹æ³ setSampleï¼è¯å¾æå¯¹è±¡ obj2èµå¼ç» obj1å é¨ç instance对象ãä»£ç æ¸ å 4çè¿è¡ç»æå¦ ä»£ç æ¸ å 5æç¤ºã æµè¯ Java ç±»æ¯å¦ç¸åçè¿è¡ç»æ java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at classloader.ClassIdentity.testClassIdentity(ClassIdentity.java:26) at classloader.ClassIdentity.main(ClassIdentity.java:9) Caused by: java.lang.ClassCastException: com.example.Sample cannot be cast to com.example.Sample at com.example.Sample.setSample(Sample.java:7) ... 6 more ä» ä»£ç æ¸ å 5ç»åºçè¿è¡ç»æå¯ä»¥çå°ï¼è¿è¡æ¶æåºäº java.lang.ClassCastExceptionå¼å¸¸ãè½ç¶ä¸¤ä¸ªå¯¹è±¡ obj1å obj2çç±»çååç¸åï¼ä½æ¯è¿ä¸¤ä¸ªç±»æ¯ç±ä¸åçç±»å è½½å¨å®ä¾æ¥å è½½çï¼å æ¤ä¸è¢« Java èææºè®¤ä¸ºæ¯ç¸åçã äºè§£äºè¿ä¸ç¹ä¹åï¼å°±å¯ä»¥çè§£ä»£çæ¨¡å¼çè®¾è®¡å¨æºäºãä»£çæ¨¡å¼æ¯ä¸ºäºä¿è¯ Java æ ¸å¿åºçç±»åå®å ¨ãææ Java åºç¨é½è³å°éè¦å¼ç¨java.lang.Objectç±»ï¼ä¹å°±æ¯è¯´å¨è¿è¡çæ¶åï¼java.lang.Objectè¿ä¸ªç±»éè¦è¢«å è½½å° Java èææºä¸ã妿è¿ä¸ªå è½½è¿ç¨ç± Java åºç¨èªå·±çç±»å è½½å¨æ¥å®æçè¯ï¼å¾å¯è½å°±åå¨å¤ä¸ªçæ¬ç java.lang.Objectç±»ï¼èä¸è¿äºç±»ä¹é´æ¯ä¸å ¼å®¹çãéè¿ä»£ç模å¼ï¼å¯¹äº Java æ ¸å¿åºçç±»çå 载工ä½ç±å¼å¯¼ç±»å è½½å¨æ¥ç»ä¸å®æï¼ä¿è¯äº Java åºç¨æä½¿ç¨ç齿¯åä¸ä¸ªçæ¬ç Java æ ¸å¿åºçç±»ï¼æ¯äºç¸å ¼å®¹çã ä¸åçç±»å è½½å¨ä¸ºç¸ååç§°çç±»å建äºé¢å¤çå称空é´ãç¸ååç§°çç±»å¯ä»¥å¹¶åå¨ Java èææºä¸ï¼åªéè¦ç¨ä¸åçç±»å è½½å¨æ¥å è½½å®ä»¬å³å¯ãä¸åç±»å è½½å¨å è½½çç±»ä¹é´æ¯ä¸å ¼å®¹çï¼è¿å°±ç¸å½äºå¨ Java èææºå é¨å建äºä¸ä¸ªä¸ªç¸äºé离ç Java 类空é´ãè¿ç§ææ¯å¨è®¸å¤æ¡æ¶ä¸é½è¢«ç¨å°ï¼åé¢ä¼è¯¦ç»ä»ç»ã **æä»¶ç³»ç»ç±»å è½½å¨** 第ä¸ä¸ªç±»å è½½å¨ç¨æ¥å è½½åå¨å¨æä»¶ç³»ç»ä¸ç Java åè代ç ã宿´çå®ç°å¦ ä»£ç æ¸ å 6æç¤ºã public class FileSystemClassLoader extends ClassLoader { private String rootDir; public FileSystemClassLoader(String rootDir) { this.rootDir = rootDir; } protected Class> findClass(String name) throws ClassNotFoundException { byte[] classData = getClassData(name); if (classData == null) { throw new ClassNotFoundException(); } else { return defineClass(name, classData, 0, classData.length); } } private byte[] getClassData(String className) { String path = classNameToPath(className); try { InputStream ins = new FileInputStream(path); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int bufferSize = 4096; byte[] buffer = new byte[bufferSize]; int bytesNumRead = 0; while ((bytesNumRead = ins.read(buffer)) != -1) { baos.write(buffer, 0, bytesNumRead); } return baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return null; } private String classNameToPath(String className) { return rootDir + File.separatorChar + className.replace('.', File.separatorChar) + ".class"; } } å¦ ä»£ç æ¸ å 6æç¤ºï¼ç±» FileSystemClassLoaderç»§æ¿èªç±» java.lang.ClassLoaderãå¨ è¡¨ 1ä¸ååºç java.lang.ClassLoaderç±»çå¸¸ç¨æ¹æ³ä¸ï¼ä¸è¬æ¥è¯´ï¼èªå·±å¼åçç±»å è½½å¨åªéè¦è¦å findClass(String name)æ¹æ³å³å¯ãjava.lang.ClassLoaderç±»çæ¹æ³loadClass()å°è£ äºå颿å°çä»£çæ¨¡å¼çå®ç°ãè¯¥æ¹æ³ä¼é¦å è°ç¨ findLoadedClass()æ¹æ³æ¥æ£æ¥è¯¥ç±»æ¯å¦å·²ç»è¢«å è½½è¿ï¼å¦ææ²¡æå è½½è¿çè¯ï¼ä¼è°ç¨ç¶ç±»å è½½å¨ç loadClass()æ¹æ³æ¥å°è¯å 载该类ï¼å¦æç¶ç±»å è½½å¨æ æ³å 载该类çè¯ï¼å°±è°ç¨ findClass()æ¹æ³æ¥æ¥æ¾è¯¥ç±»ãå æ¤ï¼ä¸ºäºä¿è¯ç±»å è½½å¨é½æ£ç¡®å®ç°ä»£ç模å¼ï¼å¨å¼åèªå·±çç±»å è½½å¨æ¶ï¼æå¥½ä¸è¦è¦å loadClass()æ¹æ³ï¼èæ¯è¦å findClass()æ¹æ³ã ç±» FileSystemClassLoaderç findClass()æ¹æ³é¦å æ ¹æ®ç±»çå ¨åå¨ç¡¬ç䏿¥æ¾ç±»çåèä»£ç æä»¶ï¼.class æä»¶ï¼ï¼ç¶å读å该æä»¶å å®¹ï¼æåéè¿ defineClass()æ¹æ³æ¥æè¿äºåè代ç è½¬æ¢æ java.lang.Classç±»çå®ä¾ã