Ò»¡¢JavaÀà¼ÓÔØ»úÖÆ
1£®¸ÅÊö
ClassÎļþÓÉÀà×°ÔØÆ÷×°ÔØºó£¬ÔÚJVMÖн«ÐγÉÒ»·ÝÃèÊöClass½á¹¹µÄÔªÐÅÏ¢¶ÔÏó£¬Í¨¹ý¸ÃÔªÐÅÏ¢¶ÔÏó¿ÉÒÔ»ñÖªClassµÄ½á¹¹ÐÅÏ¢£ºÈç¹¹Ô캯Êý£¬ÊôÐԺͷ½·¨µÈ£¬JavaÔÊÐíÓû§½èÓÉÕâ¸öClassÏà¹ØµÄÔªÐÅÏ¢¶ÔÏó¼ä½Óµ÷ÓÃClass¶ÔÏóµÄ¹¦ÄÜ¡£
ÐéÄâ»ú°ÑÃèÊöÀàµÄÊý¾Ý´ÓclassÎļþ¼ÓÔØµ½Äڴ棬²¢¶ÔÊý¾Ý½øÐÐУÑ飬ת»»½âÎöºÍ³õʼ»¯£¬×îÖÕÐγɿÉÒÔ±»ÐéÄâ»úÖ±½ÓʹÓõÄJavaÀàÐÍ£¬Õâ¾ÍÊÇÐéÄâ»úµÄÀà¼ÓÔØ»úÖÆ¡£
2£®¹¤×÷»úÖÆ
Àà×°ÔØÆ÷¾ÍÊÇѰÕÒÀàµÄ×Ö½ÚÂëÎļþ£¬²¢¹¹Ôì³öÀàÔÚJVMÄÚ²¿±íʾµÄ¶ÔÏó×é¼þ¡£ÔÚJavaÖУ¬Àà×°ÔØÆ÷°ÑÒ»¸öÀà×°ÈëJVMÖУ¬Òª¾¹ýÒÔϲ½Ö裺
(1) ×°ÔØ£º²éÕҺ͵¼ÈëClassÎļþ£»
(2) Á´½Ó£º°ÑÀàµÄ¶þ½øÖÆÊý¾ÝºÏ²¢µ½JREÖУ»
(a)УÑ飺¼ì²éÔØÈëClassÎļþÊý¾ÝµÄÕýÈ·ÐÔ£»
(b)×¼±¸£º¸øÀàµÄ¾²Ì¬±äÁ¿·ÖÅä´æ´¢¿Õ¼ä£»
(c)½âÎö£º½«·ûºÅÒýÓÃת³ÉÖ±½ÓÒýÓã»
(3) ³õʼ»¯£º¶ÔÀàµÄ¾²Ì¬±äÁ¿£¬¾²Ì¬´úÂë¿éÖ´Ðгõʼ»¯²Ù×÷

Java³ÌÐò¿ÉÒÔ¶¯Ì¬À©Õ¹ÊÇÓÉÔËÐÐÆÚ¶¯Ì¬¼ÓÔØºÍ¶¯Ì¬Á´½ÓʵÏֵģ»±ÈÈ磺Èç¹û±àдһ¸öʹÓýӿڵÄÓ¦ÓóÌÐò£¬¿ÉÒԵȵ½ÔËÐÐʱÔÙÖ¸¶¨Æäʵ¼ÊµÄʵÏÖ(¶à̬)£¬½âÎö¹ý³ÌÓÐʱºò»¹¿ÉÒÔÔÚ³õʼ»¯Ö®ºóÖ´ÐУ»±ÈÈ磺¶¯Ì¬°ó¶¨(¶à̬)£»
¡¾Àà³õʼ»¯¡¿
(1) Óöµ½new¡¢getstatic¡¢putstatic»òinvokestaticÕâ4Ìõ×Ö½ÚÂëÖ¸Áîʱ£¬Èç¹ûÀàûÓнøÐйý³õʼ»¯£¬ÔòÐèÒªÏÈ´¥·¢Æä³õʼ»¯¡£Éú³ÉÕâ4ÌõÖ¸ÁîµÄ×î³£¼ûµÄJava´úÂ볡¾°ÊÇ£ºÊ¹ÓÃnew¹Ø¼ü×ÖʵÀý»¯¶ÔÏóµÄʱºò£¬¶ÁÈ¡»òÉèÖÃÒ»¸öÀàµÄ¾²Ì¬×ֶΣ¨±»finalÐÞÊΡ¢ÒÑÔÚ±àÒëÆÚ°Ñ½á¹û·ÅÈë³£Á¿³ØµÄ¾²Ì¬×ֶγýÍ⣩µÄʱºò£¬ÒÔ¼°µ÷ÓÃÒ»¸öÀàµÄ¾²Ì¬·½·¨µÄʱºò¡£
(2) ʹÓÃjava.lang.reflect°üµÄ·½·¨¶ÔÀà½øÐз´Éäµ÷ÓõÄʱºò£¬Èç¹ûÀàûÓнøÐйý³õʼ»¯£¬ÔòÐèÒªÏÈ´¥·¢Æä³õʼ»¯¡£
(3) µ±³õʼ»¯Ò»¸öÀàµÄʱºò£¬Èç¹û·¢Ï֯䏏À໹ûÓнøÐйý³õʼ»¯£¬ÔòÐèÒªÏÈ´¥·¢Æä¸¸ÀàµÄ³õʼ»¯¡£
(4)µ±ÐéÄâ»úÆô¶¯Ê±£¬Óû§ÐèÒªÖ¸¶¨Ò»¸öÒªÖ´ÐеÄÖ÷Àࣨ°üº¬main()·½·¨µÄÄǸöÀࣩ£¬ÐéÄâ»ú»áÏȳõʼ»¯Õâ¸öÖ÷Àà¡£
Ö»ÓÐÉÏÊöËÄÖÖÇé¿ö»á´¥·¢³õʼ»¯£¬Ò²³ÆÎª¶ÔÒ»¸öÀà½øÐÐÖ÷¶¯ÒýÓ㬳ý´ËÒÔÍ⣬ËùÓÐÆäËû·½Ê½¶¼²»»á´¥·¢³õʼ»¯£¬³ÆÎª±»¶¯ÒýÓÃ
´úÂëÇåµ¥1

ÉÏÊö´úÂëÔËÐкó£¬Ö»»áÊä³ö¡¾---SuperClass init¡¿, ¶ø²»»áÊä³ö¡¾SubClass init¡¿,¶ÔÓÚ¾²Ì¬×ֶΣ¬Ö»ÓÐÖ±½Ó¶¨ÒåÕâ¸ö×ֶεÄÀà²Å»á±»³õʼ»¯,Òò´Ë£¬Í¨¹ý×ÓÀàÀ´µ÷Óø¸ÀàµÄ¾²Ì¬×ֶΣ¬Ö»»á´¥·¢¸¸ÀàµÄ³õʼ»¯,µ«ÊÇÕâÊÇÒª¿´²»Í¬µÄÐéÄâ»úµÄ²»Í¬ÊµÏÖ¡£
´úÂëÇåµ¥2

´Ë´¦²»»áÒýÆðSuperClassµÄ³õʼ»¯£¬µ«ÊÇÈ´´¥·¢ÁË¡¾[Ltest.SuperClass¡¿µÄ³õʼ»¯£¬Í¨¹ýarr.toString()¿ÉÒÔ¿´³ö£¬¶ÔÓÚÓû§´úÂëÀ´Ëµ£¬Õâ²»ÊÇÒ»¸öºÏ·¨µÄÀàÃû³Æ£¬ËüÊÇÓÉÐéÄâ»ú×Ô¶¯Éú³ÉµÄ£¬Ö±½Ó¼Ì³ÐÓÚObjectµÄ×ÓÀ࣬´´½¨¶¯×÷ÓÉ×Ö½ÚÂëÖ¸Áînewarray´¥·¢,´ËʱÊý×éÔ½½ç¼ì²éÒ²»á°éËæÊý×é¶ÔÏóµÄËùÓе÷Óùý³Ì£¬Ô½½ç¼ì²é²¢²»ÊÇ·â×°ÔÚÊý×éÔªËØ·ÃÎʵÄÀàÖУ¬¶øÊÇ·â×°ÔÚÊý×é·ÃÎʵÄxaload,xastore×Ö½ÚÂëÖ¸ÁîÖÐ.
´úÂëÇåµ¥3

¶Ô³£Á¿ConstClass.value µÄÒýÓÃʵ¼Ê¶¼±»×ª»¯ÎªNotInitializationÀà¶Ô×ÔÉí³£Á¿³ØµÄÒýÓã¬ÕâÁ½¸öÀà±»±àÒë³Éclassºó²»´æÔÚÈκÎÁªÏµ¡£
¡¾×°ÔØ¡¿
ÔÚ×°ÔØ½×¶Î£¬ÐéÄâ»úÐèÒªÍê³ÉÒÔÏÂ3¼þÊÂÇé
(1) ͨ¹ýÒ»¸öÀàµÄÈ«ÏÞ¶¨ÃûÀ´»ñÈ¡¶¨Òå´ËÀàµÄ¶þ½øÖÆ×Ö½ÚÁ÷
(2) ½«Õâ¸ö×Ö½ÚÁ÷Ëù´ú±íµÄ¾²Ì¬´æ´¢½á¹¹×ª»¯Îª·½·¨ÇøµÄÔËÐÐʱÊý¾Ý½á¹¹
(3) ÔÚJava¶ÑÖÐÉú³ÉÒ»¸ö´ú±íÕâ¸öÀàµÄjava.lang.Class¶ÔÏó£¬×÷Ϊ·½·¨ÇøÕâЩÊý¾ÝµÄ·ÃÎÊÈë¿Ú¡£
ÐéÄâ»ú¹æ·¶Öв¢Ã»ÓÐ׼ȷ˵Ã÷¶þ½øÖÆ×Ö½ÚÁ÷Ó¦¸Ã´ÓÄÄÀï»ñÈ¡ÒÔ¼°ÔõÑù»ñÈ¡,ÕâÀï¿ÉÒÔͨ¹ý¶¨Òå×Ô¼ºµÄÀà¼ÓÔØÆ÷È¥¿ØÖÆ×Ö½ÚÁ÷µÄ»ñÈ¡·½Ê½¡£
¡¾ÑéÖ¤¡¿
ÐéÄâ»úÈç¹û²»¼ì²éÊäÈëµÄ×Ö½ÚÁ÷£¬¶ÔÆäÍêÈ«ÐÅÈεϰ£¬ºÜ¿ÉÄÜ»áÒòÎªÔØÈëÁËÓꦵÄ×Ö½ÚÁ÷¶øµ¼ÖÂϵͳ±¼À£¡£
¡¾×¼±¸¡¿
×¼±¸½×¶ÎÊÇÕýʽΪÀà±äÁ¿·ÖÅä²¢ÉèÖÃÀà±äÁ¿³õʼֵµÄ½×¶Î£¬ÕâЩÄÚ´æ¶¼½«ÔÚ·½·¨ÇøÖнøÐзÖÅä,ÐèҪ˵Ã÷µÄÊÇ£º
Õâʱºò½øÐÐÄÚ´æ·ÖÅäµÄ½ö°üÀ¨Àà±äÁ¿(±»staticÐÞÊεıäÁ¿),¶ø²»°üÀ¨ÊµÀý±äÁ¿,ʵÀý±äÁ¿½«»áÔÚ¶ÔÏóʵÀý»¯Ê±Ëæ×ŶÔÏóÒ»Æð·ÖÅäÔÚJava¶ÑÖÐ;ÕâÀïËù˵µÄ³õʼֵ¡°Í¨³£Çé¿ö¡±ÊÇÊý¾ÝÀàÐ͵ÄÁãÖµ£¬¼ÙÈç:
public static int value = 123;
valueÔÚ×¼±¸½×¶Î¹ýºóµÄ³õʼֵΪ0¶ø²»ÊÇ123,¶ø°Ñvalue¸³ÖµµÄputstaticÖ¸ÁÔÚ³õʼ»¯½×¶Î²Å»á±»Ö´ÐÐ
¶þ¡¢Àà¼ÓÔØÆ÷ÓëË«Ç×ίÅÉÄ£ÐÍ
Àà¼ÓÔØÆ÷
(1) Bootstrap ClassLoader : ½«´æ·ÅÓÚ<JAVA_HOME>\libĿ¼Öе쬻òÕß±»-Xbootclasspath²ÎÊýËùÖ¸¶¨µÄ·¾¶Öе쬲¢ÇÒÊÇÐéÄâ»úʶ±ðµÄ£¨½ö°´ÕÕÎļþÃûʶ±ð£¬Èç
rt.jar Ãû×Ö²»·ûºÏµÄÀà¿â¼´Ê¹·ÅÔÚlibĿ¼ÖÐÒ²²»»á±»¼ÓÔØ£©Àà¿â¼ÓÔØµ½ÐéÄâ»úÄÚ´æÖС£Æô¶¯Àà¼ÓÔØÆ÷ÎÞ·¨±»Java³ÌÐòÖ±½ÓÒýÓÃ
(2) Extension ClassLoader : ½«<JAVA_HOME>\lib\extĿ¼Ïµģ¬»òÕß±»java.ext.dirsϵͳ±äÁ¿ËùÖ¸¶¨µÄ·¾¶ÖеÄËùÓÐÀà¿â¼ÓÔØ¡£¿ª·¢Õß¿ÉÒÔÖ±½ÓʹÓÃÀ©Õ¹Àà¼ÓÔØÆ÷¡£
(3) Application ClassLoader : ¸ºÔð¼ÓÔØÓû§Àà·¾¶(ClassPath)ÉÏËùÖ¸¶¨µÄÀà¿â,¿ª·¢Õß¿ÉÖ±½ÓʹÓá£

Ë«Ç×ίÅÉÄ£ÐÍ
¹¤×÷¹ý³Ì£ºÈç¹ûÒ»¸öÀà¼ÓÔØÆ÷½ÓÊÕµ½ÁËÀà¼ÓÔØµÄÇëÇó£¬ËüÊ×ÏȰÑÕâ¸öÇëÇóίÍиøËûµÄ¸¸Àà¼ÓÔØÆ÷È¥Íê³É£¬Ã¿¸ö²ã´ÎµÄÀà¼ÓÔØÆ÷¶¼ÊÇÈç´Ë£¬Òò´ËËùÓеļÓÔØÇëÇó¶¼Ó¦¸Ã´«Ë͵½¶¥²ãµÄÆô¶¯Àà¼ÓÔØÆ÷ÖУ¬Ö»Óе±¸¸¼ÓÔØÆ÷·´À¡×Ô¼ºÎÞ·¨Íê³ÉÕâ¸ö¼ÓÔØÇëÇó£¨ËüÔÚËÑË÷·¶Î§ÖÐûÓÐÕÒµ½ËùÐèµÄÀࣩʱ£¬×Ó¼ÓÔØÆ÷²Å»á³¢ÊÔ×Ô¼ºÈ¥¼ÓÔØ¡£
ºÃ´¦£ºjavaÀàËæ×ÅËüµÄÀà¼ÓÔØÆ÷Ò»Æð¾ß±¸ÁËÒ»ÖÖ´øÓÐÓÅÏȼ¶µÄ²ã´Î¹ØÏµ¡£ÀýÈçÀàjava.lang.Object£¬Ëü´æ·ÅÔÚrt.jarÖУ¬ÎÞÂÛÄĸöÀà¼ÓÔØÆ÷Òª¼ÓÔØÕâ¸öÀ࣬×îÖÕ¶¼»áίÅɸøÆô¶¯Àà¼ÓÔØÆ÷½øÐмÓÔØ£¬Òò´ËObjectÀàÔÚ³ÌÐòµÄ¸÷ÖÖÀà¼ÓÔØÆ÷»·¾³Öж¼ÊÇͬһ¸öÀà¡£Ïà·´£¬Èç¹ûÓû§×Ô¼ºÐ´ÁËÒ»¸öÃûΪjava.lang.ObjectµÄÀ࣬²¢·ÅÔÚ³ÌÐòµÄClasspathÖУ¬ÄÇϵͳÖн«»á³öÏÖ¶à¸ö²»Í¬µÄObjectÀ࣬javaÀàÐÍÌåϵÖÐ×î»ù´¡µÄÐÐΪҲÎÞ·¨±£Ö¤£¬Ó¦ÓóÌÐòÒ²»á±äµÃһƬ»ìÂÒ¡£
java.lang.ClassLoaderÖм¸¸ö×îÖØÒªµÄ·½·¨:
//¼ÓÔØÖ¸¶¨Ãû³Æ£¨°üÀ¨°üÃû£©µÄ¶þ½øÖÆÀàÐÍ£¬¹©Óû§µ÷ÓÃµÄ½Ó¿Ú public Class<?> loadClass(String name); //¼ÓÔØÖ¸¶¨Ãû³Æ£¨°üÀ¨°üÃû£©µÄ¶þ½øÖÆÀàÐÍ£¬Í¬Ê±Ö¸¶¨ÊÇ·ñ½âÎö
£¨µ«ÊÇ£¬ÕâÀïµÄresolve²ÎÊý²»Ò»¶¨ÕæÕýÄÜ´ïµ½½âÎöµÄЧ¹û£©£¬¹©¼Ì³ÐÓà protected synchronized Class<?> loadClass(String name, boolean resolve); protected Class<?> findClass(String name) //¶¨ÒåÀàÐÍ£¬Ò»°ãÔÚfindClass·½·¨ÖжÁÈ¡µ½¶ÔÓ¦×Ö½ÚÂëºóµ÷Ó㬿ÉÒÔ¿´³ö²»¿É¼Ì³Ð
£¨ËµÃ÷£ºJVMÒѾʵÏÖÁ˶ÔÓ¦µÄ¾ßÌ幦ÄÜ£¬½âÎö¶ÔÓ¦µÄ×Ö½ÚÂ룬
²úÉú¶ÔÓ¦µÄÄÚ²¿Êý¾Ý½á¹¹·ÅÖõ½·½·¨Çø£¬ËùÒÔÎÞÐ踲д£¬Ö±½Óµ÷ÓþͿÉÒÔÁË£© protected final Class<?> defineClass(String name, byte[] b,
int off, int len) throws ClassFormatError{} |
ClassFormatError{}ÈçÏÂÊÇʵÏÖË«Ç×ίÅÉÄ£Ð͵ÄÖ÷Òª´úÂ룺

Èý¡¢·´Éä
Reflection»úÖÆÔÊÐí³ÌÐòÔÚÕýÔÚÖ´ÐеĹý³ÌÖУ¬ÀûÓÃReflection APIsÈ¡µÃÈκÎÒÑÖªÃû³ÆµÄÀàµÄÄÚ²¿ÐÅÏ¢£¬°üÀ¨£ºpackage¡¢
type parameters¡¢ superclass¡¢ implemented interfaces¡¢
inner classes¡¢ outer classes¡¢ fields¡¢ constructors¡¢
methods¡¢ modifiersµÈ£¬²¢¿ÉÒÔÔÚÖ´ÐеĹý³ÌÖУ¬¶¯Ì¬Éú³Éinstances¡¢±ä¸üfieldsÄÚÈÝ»ò»½Æðmethods¡£
1¡¢»ñÈ¡¹¹Ôì·½·¨
ClassÀàÌṩÁËËĸöpublic·½·¨£¬ÓÃÓÚ»ñȡij¸öÀàµÄ¹¹Ôì·½·¨¡£
Constructor getConstructor(Class[] params)
¸ù¾Ý¹¹Ô캯ÊýµÄ²ÎÊý£¬·µ»ØÒ»¸ö¾ßÌåµÄ¾ßÓÐpublicÊôÐԵĹ¹Ô캯Êý
¡¡¡¡¡¡¡¡Constructor getConstructors()
·µ»ØËùÓоßÓÐpublicÊôÐԵĹ¹Ô캯ÊýÊý×é
¡¡¡¡¡¡¡¡Constructor getDeclaredConstructor(Class[] params)
¸ù¾Ý¹¹Ô캯ÊýµÄ²ÎÊý£¬·µ»ØÒ»¸ö¾ßÌåµÄ¹¹Ô캯Êý£¨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
¡¡¡¡¡¡¡¡Constructor getDeclaredConstructors()
·µ»Ø¸ÃÀàÖÐËùÓеĹ¹Ô캯ÊýÊý×飨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©

2¡¢»ñÈ¡ÀàµÄ³ÉÔ±·½·¨
Óë»ñÈ¡¹¹Ôì·½·¨µÄ·½Ê½Ïàͬ£¬´æÔÚËÄÖÖ»ñÈ¡³ÉÔ±·½·¨µÄ·½Ê½¡£¡¡
Method getMethod(String name, Class[] params)
¸ù¾Ý·½·¨ÃûºÍ²ÎÊý£¬·µ»ØÒ»¸ö¾ßÌåµÄ¾ßÓÐpublicÊôÐԵķ½·¨
¡¡¡¡¡¡¡¡Method[] getMethods()
·µ»ØËùÓоßÓÐpublicÊôÐԵķ½·¨Êý×é
¡¡¡¡¡¡¡¡Method getDeclaredMethod(String name, Class[] params)
¸ù¾Ý·½·¨ÃûºÍ²ÎÊý£¬·µ»ØÒ»¸ö¾ßÌåµÄ·½·¨£¨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
¡¡¡¡¡¡¡¡Method[] getDeclaredMethods()
·µ»Ø¸ÃÀàÖеÄËùÓеķ½·¨Êý×飨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©

3¡¢»ñÈ¡ÀàµÄ³ÉÔ±±äÁ¿£¨³ÉÔ±ÊôÐÔ£©
´æÔÚËÄÖÖ»ñÈ¡³ÉÔ±ÊôÐԵķ½·¨
¡¡¡¡¡¡¡¡Field getField(String name)
¸ù¾Ý±äÁ¿Ãû£¬·µ»ØÒ»¸ö¾ßÌåµÄ¾ßÓÐpublicÊôÐԵijÉÔ±±äÁ¿
¡¡¡¡¡¡¡¡Field[] getFields()
·µ»Ø¾ßÓÐpublicÊôÐԵijÉÔ±±äÁ¿µÄÊý×é
¡¡¡¡¡¡¡¡Field getDeclaredField(String name)
¸ù¾Ý±äÁ¿Ãû£¬·µ»ØÒ»¸ö³ÉÔ±±äÁ¿£¨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
¡¡¡¡¡¡¡¡Field[] getDelcaredFields()
·µ»ØËùÓгÉÔ±±äÁ¿×é³ÉµÄÊý×飨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
|