Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëÀí½âJavaÀàÐÍÐÅÏ¢(Class¶ÔÏó)Óë·´Éä»úÖÆ
 
À´Ô´£ºÍøÂç ·¢²¼ÓÚ£º 2017-5-10
  2703  次浏览      27
 

±¾ÆªÖ÷ÒªÊÇÉîÈë¶ÔJavaÖеÄClass¶ÔÏó½øÐзÖÎö£¬Õâ¶ÔºóÐøÉîÈëÀí½â·´Éä¼¼Êõ·Ç³£ÖØÒª£¬Ö÷ÒªÄÚÈÝÈçÏ£º

ÉîÈëÀí½âClass¶ÔÏó

RRTIµÄ¸ÅÄîÒÔ¼°Class¶ÔÏó×÷ÓÃ

Class¶ÔÏóµÄ¼ÓÔØ¼°Æä»ñÈ¡·½Ê½

Class¶ÔÏóµÄ¼ÓÔØ

ClassforName·½·¨

Class×ÖÃæ³£Á¿

Àí½â·º»¯µÄClass¶ÔÏóÒýÓÃ

¹ØÓÚÀàÐÍת»»µÄÎÊÌâ

instanceof ¹Ø¼ü×ÖÓëisInstance·½·¨

Àí½â·´Éä¼¼Êõ

ConstructorÀ༰ÆäÓ÷¨

FieldÀ༰ÆäÓ÷¨

MethodÀ༰ÆäÓ÷¨

·´Éä°üÖеÄArrayÀà

ÉîÈëÀí½âClass¶ÔÏó

RRTIµÄ¸ÅÄîÒÔ¼°Class¶ÔÏó×÷ÓÃ

ÈÏʶClass¶ÔÏó֮ǰ£¬ÏÈÀ´Á˽âÒ»¸ö¸ÅÄRTTI£¨Run-Time Type Identification£©ÔËÐÐʱÀàÐÍʶ±ð£¬¶ÔÓÚÕâ¸ö´ÊÒ»Ö±ÊÇ C++ ÖеĸÅÄÖÁÓÚJavaÖгöÏÖRRTIµÄ˵·¨ÔòÊÇÔ´ÓÚ¡¶Thinking in Java¡·Ò»Ê飬Æä×÷ÓÃÊÇÔÚÔËÐÐʱʶ±ðÒ»¸ö¶ÔÏóµÄÀàÐͺÍÀàµÄÐÅÏ¢£¬ÕâÀï·ÖÁ½ÖÖ£º´«Í³µÄ¡±RRTI¡±,Ëü¼Ù¶¨ÎÒÃÇÔÚ±àÒëÆÚÒÑÖªµÀÁËËùÓÐÀàÐÍ(ÔÚûÓз´Éä»úÖÆ´´½¨ºÍʹÓÃÀà¶ÔÏóʱ£¬Ò»°ã¶¼ÊDZàÒëÆÚÒÑÈ·¶¨ÆäÀàÐÍ£¬Èçnew¶ÔÏóʱ¸ÃÀà±ØÐëÒѶ¨ÒåºÃ)£¬ÁíÍâÒ»ÖÖÊÇ·´Éä»úÖÆ£¬ËüÔÊÐíÎÒÃÇÔÚÔËÐÐʱ·¢ÏÖºÍʹÓÃÀàÐ͵ÄÐÅÏ¢¡£ÔÚJavaÖÐÓÃÀ´±íʾÔËÐÐʱÀàÐÍÐÅÏ¢µÄ¶ÔÓ¦Àà¾ÍÊÇClassÀ࣬ClassÀàÒ²ÊÇÒ»¸öʵʵÔÚÔÚµÄÀ࣬´æÔÚÓÚJDKµÄjava.lang°üÖУ¬Æä²¿·ÖÔ´ÂëÈçÏ£º

public final class Class<T> implements java.io.Serializable,
GenericDeclaration,Type, AnnotatedElement {
private static final int ANNOTATION= 0x00002000;
private static final int ENUM = 0x00004000;
private static final int SYNTHETIC = 0x00001000;

private static native void registerNatives();
static {
registerNatives();
}

/*
* Private constructor. Only the Java Virtual Machine creates
Class objects.£¨Ë½Óй¹Ô죬ֻÄÜÓÉJVM´´½¨¸ÃÀࣩ
* This constructor is not used and prevents the default
constructor being
* generated.
*/
private Class(ClassLoader loader) {
// Initialize final field for classLoader.
The initialization value of non-null
// prevents future JIT optimizations from
assuming this final field is null.
classLoader = loader;
}

ClassÀà±»´´½¨ºóµÄ¶ÔÏó¾ÍÊÇClass¶ÔÏó£¬×¢Ò⣬Class¶ÔÏó±íʾµÄÊÇ×Ô¼ºÊÖ¶¯±àдÀàµÄÀàÐÍÐÅÏ¢£¬±ÈÈç´´½¨Ò»¸öShapesÀ࣬ÄÇô£¬JVM¾Í»á´´½¨Ò»¸öShapes¶ÔÓ¦ClassÀàµÄClass¶ÔÏ󣬸ÃClass¶ÔÏó±£´æÁËShapesÀàÏà¹ØµÄÀàÐÍÐÅÏ¢¡£Êµ¼ÊÉÏÔÚJavaÖÐÿ¸öÀà¶¼ÓÐÒ»¸öClass¶ÔÏó£¬Ã¿µ±ÎÒÃDZàд²¢ÇÒ±àÒëÒ»¸öд´½¨µÄÀà¾Í»á²úÉúÒ»¸ö¶ÔÓ¦Class¶ÔÏó²¢ÇÒÕâ¸öClass¶ÔÏó»á±»±£´æÔÚͬÃû.classÎļþÀï(±àÒëºóµÄ×Ö½ÚÂëÎļþ±£´æµÄ¾ÍÊÇClass¶ÔÏó)£¬ÄÇΪʲôÐèÒªÕâÑùÒ»¸öClass¶ÔÏóÄØ£¿ÊÇÕâÑùµÄ£¬µ±ÎÒÃÇnewÒ»¸öжÔÏó»òÕßÒýÓþ²Ì¬³ÉÔ±±äÁ¿Ê±£¬JavaÐéÄâ»ú(JVM)ÖеÄÀà¼ÓÔØÆ÷×Óϵͳ»á½«¶ÔÓ¦Class¶ÔÏó¼ÓÔØµ½JVMÖУ¬È»ºóJVMÔÙ¸ù¾ÝÕâ¸öÀàÐÍÐÅÏ¢Ïà¹ØµÄClass¶ÔÏó´´½¨ÎÒÃÇÐèҪʵÀý¶ÔÏó»òÕßÌṩ¾²Ì¬±äÁ¿µÄÒýÓÃÖµ¡£ÐèÒªÌØ±ð×¢ÒâµÄÊÇ£¬ÊÖ¶¯±àдµÄÿ¸öclassÀ࣬ÎÞÂÛ´´½¨¶àÉÙ¸öʵÀý¶ÔÏó£¬ÔÚJVMÖж¼Ö»ÓÐÒ»¸öClass¶ÔÏ󣬼´ÔÚÄÚ´æÖÐÿ¸öÀàÓÐÇÒÖ»ÓÐÒ»¸öÏà¶ÔÓ¦µÄClass¶ÔÏó£¬Í¦ÞÖ¿Ú£¬Í¨¹ýÏÂͼÀí½â£¨ÄÚ´æÖеļòÒ×ÏÖÏóͼ£©£º

µ½ÕâÎÒÃÇÒ²¾Í¿ÉÒԵóöÒÔϼ¸µãÐÅÏ¢£º

ClassÀàÒ²ÊÇÀàµÄÒ»ÖÖ£¬Óëclass¹Ø¼ü×ÖÊDz»Ò»ÑùµÄ¡£

ÊÖ¶¯±àдµÄÀà±»±àÒëºó»á²úÉúÒ»¸öClass¶ÔÏ󣬯ä±íʾµÄÊÇ´´½¨µÄÀàµÄÀàÐÍÐÅÏ¢£¬¶øÇÒÕâ¸öClass¶ÔÏó±£´æÔÚͬÃû.classµÄÎļþÖÐ(×Ö½ÚÂëÎļþ)£¬±ÈÈç´´½¨Ò»¸öShapesÀ࣬±àÒëShapesÀàºó¾Í»á´´½¨Æä°üº¬ShapesÀàÏà¹ØÀàÐÍÐÅÏ¢µÄClass¶ÔÏ󣬲¢±£´æÔÚShapes.class×Ö½ÚÂëÎļþÖС£

ÿ¸öͨ¹ý¹Ø¼ü×Öclass±êʶµÄÀ࣬ÔÚÄÚ´æÖÐÓÐÇÒÖ»ÓÐÒ»¸öÓëÖ®¶ÔÓ¦µÄClass¶ÔÏóÀ´ÃèÊöÆäÀàÐÍÐÅÏ¢£¬ÎÞÂÛ´´½¨¶àÉÙ¸öʵÀý¶ÔÏ󣬯äÒÀ¾ÝµÄ¶¼ÊÇÓÃÒ»¸öClass¶ÔÏó¡£

ClassÀàÖ»´æË½Óй¹Ô캯Êý£¬Òò´Ë¶ÔÓ¦Class¶ÔÏóÖ»ÄÜÓÐJVM´´½¨ºÍ¼ÓÔØ

ClassÀàµÄ¶ÔÏó×÷ÓÃÊÇÔËÐÐʱÌṩ»ò»ñµÃij¸ö¶ÔÏóµÄÀàÐÍÐÅÏ¢£¬Õâµã¶ÔÓÚ·´Éä¼¼ÊõºÜÖØÒª(¹ØÓÚ·´ÉäÉÔºó·ÖÎö)¡£

Class¶ÔÏóµÄ¼ÓÔØ¼°Æä»ñÈ¡·½Ê½

Class¶ÔÏóµÄ¼ÓÔØ

Ç°ÃæÎÒÃÇÒÑÌáµ½¹ý£¬Class¶ÔÏóÊÇÓÉJVM¼ÓÔØµÄ£¬ÄÇôÆä¼ÓÔØÊ±»úÊÇ£¿Êµ¼ÊÉÏËùÓеÄÀà¶¼ÊÇÔÚ¶ÔÆäµÚÒ»´ÎʹÓÃʱ¶¯Ì¬¼ÓÔØµ½JVMÖе쬵±³ÌÐò´´½¨µÚÒ»¸ö¶ÔÀàµÄ¾²Ì¬³ÉÔ±ÒýÓÃʱ£¬¾Í»á¼ÓÔØÕâ¸ö±»Ê¹ÓõÄÀà(ʵ¼ÊÉϼÓÔØµÄ¾ÍÊÇÕâ¸öÀàµÄ×Ö½ÚÂëÎļþ)£¬×¢Ò⣬ʹÓÃnew²Ù×÷·û´´½¨ÀàµÄÐÂʵÀý¶ÔÏóÒ²»á±»µ±×÷¶ÔÀàµÄ¾²Ì¬³ÉÔ±µÄÒýÓÃ(¹¹Ô캯ÊýÒ²ÊÇÀàµÄ¾²Ì¬·½·¨)£¬ÓÉ´Ë¿´À´Java³ÌÐòÔÚËüÃÇ¿ªÊ¼ÔËÐÐ֮ǰ²¢·Ç±»ÍêÈ«¼ÓÔØµ½ÄÚ´æµÄ£¬Æä¸÷¸ö²¿·ÖÊǰ´Ðè¼ÓÔØ£¬ËùÒÔÔÚʹÓøÃÀàʱ£¬Àà¼ÓÔØÆ÷Ê×ÏÈ»á¼ì²éÕâ¸öÀàµÄClass¶ÔÏóÊÇ·ñÒѱ»¼ÓÔØ(ÀàµÄʵÀý¶ÔÏó´´½¨Ê±ÒÀ¾ÝClass¶ÔÏóÖÐÀàÐÍÐÅÏ¢Íê³ÉµÄ)£¬Èç¹û»¹Ã»ÓмÓÔØ£¬Ä¬ÈϵÄÀà¼ÓÔØÆ÷¾Í»áÏȸù¾ÝÀàÃû²éÕÒ.classÎļþ(±àÒëºóClass¶ÔÏó±»±£´æÔÚͬÃûµÄ.classÎļþÖÐ)£¬ÔÚÕâ¸öÀàµÄ×Ö½ÚÂëÎļþ±»¼ÓÔØÊ±£¬ËüÃDZØÐë½ÓÊÜÏà¹ØÑéÖ¤£¬ÒÔÈ·±£ÆäûÓб»ÆÆ»µ²¢ÇÒ²»°üº¬²»Á¼Java´úÂë(ÕâÊÇjavaµÄ°²È«»úÖÆ¼ì²â)£¬ÍêȫûÓÐÎÊÌâºó¾Í»á±»¶¯Ì¬¼ÓÔØµ½ÄÚ´æÖУ¬´ËʱÏ൱ÓÚClass¶ÔÏóÒ²¾Í±»ÔØÈëÄÚ´æÁË(±Ï¾¹.class×Ö½ÚÂëÎļþ±£´æµÄ¾ÍÊÇClass¶ÔÏó)£¬Í¬Ê±Ò²¾Í¿ÉÒÔ±»ÓÃÀ´´´½¨Õâ¸öÀàµÄËùÓÐʵÀý¶ÔÏó¡£ÏÂÃæÍ¨¹ýÒ»¸ö¼òµ¥Àý×ÓÀ´ËµÃ÷Class¶ÔÏó±»¼ÓÔØµÄʱ»úÎÊÌ⣨Àý×ÓÒýÓÃ×ÔThinking in Java£©£º

package com.zejian;

class Candy {
static { System.out.println("Loading Candy"); }
}

class Gum {
static { System.out.println("Loading Gum"); }
}

class Cookie {
static { System.out.println("Loading Cookie"); }
}

public class SweetShop {
public static void print(Object obj) {
System.out.println(obj);
}
public static void main(String[] args) {
print("inside main");
new Candy();
print("After creating Candy");
try {
Class.forName("com.zejian.Gum");
} catch(ClassNotFoundException e) {
print("Couldn't find Gum");
}
print("After Class.forName(\"com.zejian.Gum\")");
new Cookie();
print("After creating Cookie");
}
}

ÔÚÉÏÊö´úÂëÖÐ,ÿ¸öÀàCandy¡¢Gum¡¢Cookie¶¼´æÔÚÒ»¸östaticÓï¾ä£¬Õâ¸öÓï¾ä»áÔÚÀàµÚÒ»´Î±»¼ÓÔØÊ±Ö´ÐУ¬Õâ¸öÓï¾äµÄ×÷ÓþÍÊǸæËßÎÒÃǸÃÀàÔÚʲôʱºò±»¼ÓÔØ£¬Ö´Ðнá¹û£º

inside main
Loading Candy
After creating Candy
Loading Gum
After Class.forName("com.zejian.Gum")
Loading Cookie
After creating Cookie

Process finished with exit code 0

´Ó½á¹ûÀ´¿´£¬newÒ»¸öCandy¶ÔÏóºÍCookie¶ÔÏ󣬹¹Ô캯Êý½«±»µ÷Óã¬ÊôÓÚ¾²Ì¬·½·¨µÄÒýÓã¬CandyÀàµÄClass¶ÔÏóºÍCookieµÄClass¶ÔÏó¿Ï¶¨»á±»¼ÓÔØ£¬±Ï¾¹CandyʵÀý¶ÔÏóµÄ´´½¨ÒÀ¾ÝÆäClass¶ÔÏ󡣱ȽÏÓÐÒâ˼µÄÊÇ

Class.forName("com.zejian.Gum");

ÆäÖÐforName·½·¨ÊÇClassÀàµÄÒ»¸östatic³ÉÔ±·½·¨£¬¼ÇסËùÓеÄClass¶ÔÏó¶¼Ô´ÓÚÕâ¸öClassÀ࣬Òò´ËClassÀàÖж¨ÒåµÄ·½·¨½«ÊÊÓ¦ËùÓÐClass¶ÔÏó¡£ÕâÀïͨ¹ýforName·½·¨£¬ÎÒÃÇ¿ÉÒÔ»ñÈ¡µ½GumÀà¶ÔÓ¦µÄClass¶ÔÏóÒýÓᣴӴòÓ¡½á¹ûÀ´¿´£¬µ÷ÓÃforName·½·¨½«»áµ¼ÖÂGumÀà±»¼ÓÔØ(ǰÌáÊÇGumÀà´ÓÀ´Ã»Óб»¼ÓÔØ¹ý)¡£

Class.forName·½·¨

ͨ¹ýÉÏÊöµÄ°¸Àý£¬ÎÒÃÇÒ²¾ÍÖªµÀClass.forName()·½·¨µÄµ÷Óý«»á·µ»ØÒ»¸ö¶ÔÓ¦ÀàµÄClass¶ÔÏó£¬Òò´ËÈç¹ûÎÒÃÇÏë»ñȡһ¸öÀàµÄÔËÐÐʱÀàÐÍÐÅÏ¢²¢¼ÓÒÔʹÓÃʱ£¬¿ÉÒÔµ÷ÓÃClass.forName()·½·¨»ñÈ¡Class¶ÔÏóµÄÒýÓã¬ÕâÑù×öµÄºÃ´¦ÊÇÎÞÐèͨ¹ý³ÖÓиÃÀàµÄʵÀý¶ÔÏóÒýÓöøÈ¥»ñÈ¡Class¶ÔÏó£¬ÈçϵĵÚ2ÖÖ·½Ê½ÊÇͨ¹ýÒ»¸öʵÀý¶ÔÏó»ñȡһ¸öÀàµÄClass¶ÔÏ󣬯äÖеÄgetClass()ÊÇ´Ó¶¥¼¶ÀàObject¼Ì³Ð¶øÀ´µÄ£¬Ëü½«·µ»Ø±íʾ¸Ã¶ÔÏóµÄʵ¼ÊÀàÐ͵ÄClass¶ÔÏóÒýÓá£

public static void main(String[] args) {

try{
//ͨ¹ýClass.forName»ñÈ¡GumÀàµÄClass¶ÔÏó
Class clazz=Class.forName("com.zejian.Gum");
System.out.println("forName=clazz:"+clazz.getName());
}catch (ClassNotFoundException e){
e.printStackTrace();
}

//ͨ¹ýʵÀý¶ÔÏó»ñÈ¡GumµÄClass¶ÔÏó
Gum gum = new Gum();
Class clazz2=gum.getClass();
System.out.println("new=clazz2:"+clazz2.getName());

}

×¢Òâµ÷ÓÃforName·½·¨Ê±ÐèÒª²¶»ñÒ»¸öÃû³ÆÎªClassNotFoundExceptionµÄÒì³££¬ÒòΪforName·½·¨ÔÚ±àÒëÆ÷ÊÇÎÞ·¨¼ì²âµ½Æä´«µÝµÄ×Ö·û´®¶ÔÓ¦µÄÀàÊÇ·ñ´æÔڵģ¬Ö»ÄÜÔÚ³ÌÐòÔËÐÐʱ½øÐмì²é£¬Èç¹û²»´æÔھͻáÅ׳öClassNotFoundExceptionÒì³£¡£

Class×ÖÃæ³£Á¿

ÔÚJavaÖдæÔÚÁíÒ»ÖÖ·½Ê½À´Éú³ÉClass¶ÔÏóµÄÒýÓã¬Ëü¾ÍÊÇClass×ÖÃæ³£Á¿£¬ÈçÏ£º

//×ÖÃæ³£Á¿µÄ·½Ê½»ñÈ¡Class¶ÔÏó
Class clazz = Gum.class;

ÕâÖÖ·½Ê½Ïà¶ÔÇ°ÃæÁ½ÖÖ·½·¨¸ü¼Ó¼òµ¥£¬¸ü°²È«¡£ÒòΪËüÔÚ±àÒëÆ÷¾Í»áÊܵ½±àÒëÆ÷µÄ¼ì²éͬʱÓÉÓÚÎÞÐèµ÷ÓÃforName·½·¨Ð§ÂÊÒ²»á¸ü¸ß£¬ÒòΪͨ¹ý×ÖÃæÁ¿µÄ·½·¨»ñÈ¡Class¶ÔÏóµÄÒýÓò»»á×Ô¶¯³õʼ»¯¸ÃÀà¡£¸ü¼ÓÓÐȤµÄÊÇ×ÖÃæ³£Á¿µÄ»ñÈ¡Class¶ÔÏóÒýÓ÷½Ê½²»½ö¿ÉÒÔÓ¦ÓÃÓÚÆÕͨµÄÀ࣬Ҳ¿ÉÒÔÓ¦ÓÃÓýӿڣ¬Êý×éÒÔ¼°»ù±¾Êý¾ÝÀàÐÍ£¬ÕâµãÔÚ·´Éä¼¼ÊõÓ¦Óô«µÝ²ÎÊýʱºÜÓаïÖú£¬¹ØÓÚ·´Éä¼¼ÊõÉÔºó»á·ÖÎö£¬ÓÉÓÚ»ù±¾Êý¾ÝÀàÐÍ»¹ÓжÔÓ¦µÄ»ù±¾°ü×°ÀàÐÍ£¬Æä°ü×°ÀàÐÍÓÐÒ»¸ö±ê×¼×Ö¶ÎTYPE£¬¶øÕâ¸öTYPE¾ÍÊÇÒ»¸öÒýÓã¬Ö¸Ïò»ù±¾Êý¾ÝÀàÐ͵ÄClass¶ÔÏ󣬯äµÈ¼Ûת»»ÈçÏ£¬Ò»°ãÇé¿öϸüÇãÏòʹÓÃ.classµÄÐÎʽ£¬ÕâÑù¿ÉÒÔ±£³ÖÓëÆÕͨÀàµÄÐÎʽͳһ¡£

boolean.class = Boolean.TYPE;
char.class = Character.TYPE;
byte.class = Byte.TYPE;
short.class = Short.TYPE;
int.class = Integer.TYPE;
long.class = Long.TYPE;
float.class = Float.TYPE;
double.class = Double.TYPE;
void.class = Void.TYPE;

Ç°ÃæÌáµ½¹ý£¬Ê¹ÓÃ×ÖÃæ³£Á¿µÄ·½Ê½»ñÈ¡Class¶ÔÏóµÄÒýÓò»»á´¥·¢ÀàµÄ³õʼ»¯£¬ÕâÀïÎÒÃÇ¿ÉÄÜÐèÒª¼òµ¥Á˽âÒ»ÏÂÀà¼ÓÔØµÄ¹ý³Ì£¬ÈçÏ£º

¼ÓÔØ£ºÀà¼ÓÔØ¹ý³ÌµÄÒ»¸ö½×¶Î£ºÍ¨¹ýÒ»¸öÀàµÄÍêÈ«ÏÞ¶¨²éÕÒ´ËÀà×Ö½ÚÂëÎļþ£¬²¢ÀûÓÃ×Ö½ÚÂëÎļþ´´½¨Ò»¸öClass¶ÔÏó

Á´½Ó£ºÑéÖ¤×Ö½ÚÂëµÄ°²È«ÐÔºÍÍêÕûÐÔ£¬×¼±¸½×¶ÎÕýʽΪ¾²Ì¬Óò·ÖÅä´æ´¢¿Õ¼ä£¬×¢Òâ´ËʱֻÊÇ·ÖÅ侲̬³ÉÔ±±äÁ¿µÄ´æ´¢¿Õ¼ä£¬²»°üº¬ÊµÀý³ÉÔ±±äÁ¿£¬Èç¹û±ØÒªµÄ»°£¬½âÎöÕâ¸öÀà´´½¨µÄ¶ÔÆäËûÀàµÄËùÓÐÒýÓá£

³õʼ»¯£ºÀà¼ÓÔØ×îºó½×¶Î£¬Èô¸ÃÀà¾ßÓг¬À࣬Ôò¶ÔÆä½øÐгõʼ»¯£¬Ö´Ðо²Ì¬³õʼ»¯Æ÷ºÍ¾²Ì¬³õʼ»¯³ÉÔ±±äÁ¿¡£

ÓÉ´Ë¿ÉÖª£¬ÎÒÃÇ»ñÈ¡×ÖÃæ³£Á¿µÄClassÒýÓÃʱ£¬´¥·¢µÄÓ¦¸ÃÊǼÓÔØ½×¶Î£¬ÒòΪÔÚÕâ¸ö½×¶ÎClass¶ÔÏóÒÑ´´½¨Íê³É£¬»ñÈ¡ÆäÒýÓò¢²»À§ÄÑ£¬¶øÎÞÐè´¥·¢ÀàµÄ×îºó½×¶Î³õʼ»¯¡£ÏÂÃæÍ¨¹ýСÀý×ÓÀ´ÑéÖ¤Õâ¸ö¹ý³Ì£º

import java.util.*;

class Initable {
//±àÒëÆÚ¾²Ì¬³£Á¿
static final int staticFinal = 47;
//·Ç±àÆÚ¾²Ì¬³£Á¿
static final int staticFinal2 =
ClassInitialization.rand.nextInt(1000);
static {
System.out.println("Initializing Initable");
}
}

class Initable2 {
//¾²Ì¬³ÉÔ±±äÁ¿
static int staticNonFinal = 147;
static {
System.out.println("Initializing Initable2");
}
}

class Initable3 {
//¾²Ì¬³ÉÔ±±äÁ¿
static int staticNonFinal = 74;
static {
System.out.println("Initializing Initable3");
}
}

public class ClassInitialization {
public static Random rand = new Random(47);
public static void main(String[] args) throws Exception {
//×ÖÃæ³£Á¿»ñÈ¡·½Ê½»ñÈ¡Class¶ÔÏó
Class initable = Initable.class;
System.out.println("After creating Initable ref");
//²»´¥·¢Àà³õʼ»¯
System.out.println(Initable.staticFinal);
//»á´¥·¢Àà³õʼ»¯
System.out.println(Initable.staticFinal2);
//»á´¥·¢Àà³õʼ»¯
System.out.println(Initable2.staticNonFinal);
//forName·½·¨»ñÈ¡Class¶ÔÏó
Class initable3 = Class.forName("Initable3");
System.out.println("After creating Initable3 ref");
System.out.println(Initable3.staticNonFinal);
}
}

Ö´Ðнá¹û£º

After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
Initializing Initable3
After creating Initable3 ref
74

´ÓÊä³ö½á¹ûÀ´¿´£¬¿ÉÒÔ·¢ÏÖ£¬Í¨¹ý×ÖÃæ³£Á¿»ñÈ¡·½Ê½»ñÈ¡InitableÀàµÄClass¶ÔÏó²¢Ã»Óд¥·¢InitableÀàµÄ³õʼ»¯£¬ÕâµãÒ²ÑéÖ¤ÁËÇ°ÃæµÄ·ÖÎö£¬Í¬Ê±·¢ÏÖµ÷ÓÃInitable.staticFinal±äÁ¿Ê±Ò²Ã»Óд¥·¢³õʼ»¯£¬ÕâÊÇÒòΪstaticFinalÊôÓÚ±àÒëÆÚ¾²Ì¬³£Á¿£¬ÔÚ±àÒë½×¶Îͨ¹ý³£Á¿´«²¥ÓÅ»¯µÄ·½Ê½½«InitableÀàµÄ³£Á¿staticFinal´æ´¢µ½ÁËÒ»¸ö³ÆÎªNotInitializationÀàµÄ³£Á¿³ØÖУ¬ÔÚÒÔºó¶ÔInitableÀà³£Á¿staticFinalµÄÒýÓÃʵ¼Ê¶¼×ª»¯Îª¶ÔNotInitializationÀà¶Ô×ÔÉí³£Á¿³ØµÄÒýÓã¬ËùÒÔÔÚ±àÒëÆÚºó£¬¶Ô±àÒëÆÚ³£Á¿µÄÒýÓö¼½«ÔÚNotInitializationÀàµÄ³£Á¿³Ø»ñÈ¡£¬ÕâÒ²¾ÍÊÇÒýÓñàÒëÆÚ¾²Ì¬³£Á¿²»»á´¥·¢InitableÀà³õʼ»¯µÄÖØÒªÔ­Òò¡£µ«ÔÚÖ®ºóµ÷ÓÃÁËInitable.staticFinal2±äÁ¿ºó¾Í´¥·¢ÁËInitableÀàµÄ³õʼ»¯£¬×¢ÒâstaticFinal2ËäÈ»±»staticºÍfinalÐÞÊΣ¬µ«ÆäÖµÔÚ±àÒëÆÚ²¢²»ÄÜÈ·¶¨£¬Òò´ËstaticFinal2²¢²»ÊDZàÒëÆÚ³£Á¿£¬Ê¹ÓøñäÁ¿±ØÐëÏȳõʼ»¯InitableÀà¡£Initable2ºÍInitable3ÀàÖж¼ÊǾ²Ì¬³ÉÔ±±äÁ¿²¢·Ç±àÒëÆÚ³£Á¿£¬ÒýÓö¼»á´¥·¢³õʼ»¯¡£ÖÁÓÚforName·½·¨»ñÈ¡Class¶ÔÏ󣬿϶¨»á´¥·¢³õʼ»¯£¬ÕâµãÔÚÇ°ÃæÒÑ·ÖÎö¹ý¡£µ½Õ⼸ÖÖ»ñÈ¡Class¶ÔÏóµÄ·½Ê½Ò²¶¼·ÖÎöÍ꣬ok~,µ½´ËÕâÀï¿ÉÒԵóöС½áÂÛ£º

»ñÈ¡Class¶ÔÏóÒýÓõķ½Ê½3ÖÖ£¬Í¨¹ý¼Ì³Ð×ÔObjectÀàµÄgetClass·½·¨£¬ClassÀàµÄ¾²Ì¬·½·¨forNameÒÔ¼°×ÖÃæ³£Á¿µÄ·½Ê½¡±.class¡±¡£

ÆäÖÐʵÀýÀàµÄgetClass·½·¨ºÍClassÀàµÄ¾²Ì¬·½·¨forName¶¼½«»á´¥·¢ÀàµÄ³õʼ»¯½×¶Î£¬¶ø×ÖÃæ³£Á¿»ñÈ¡Class¶ÔÏóµÄ·½Ê½Ôò²»»á´¥·¢³õʼ»¯¡£

³õʼ»¯ÊÇÀà¼ÓÔØµÄ×îºóÒ»¸ö½×¶Î£¬Ò²¾ÍÊÇ˵Íê³ÉÕâ¸ö½×¶ÎºóÀàÒ²¾Í¼ÓÔØµ½ÄÚ´æÖÐ(Class¶ÔÏóÔÚ¼ÓÔØ½×¶ÎÒѱ»´´½¨)£¬´Ëʱ¿ÉÒÔ¶ÔÀà½øÐи÷ÖÖ±ØÒªµÄ²Ù×÷ÁË£¨Èçnew¶ÔÏ󣬵÷Óþ²Ì¬³ÉÔ±µÈ£©£¬×¢ÒâÔÚÕâ¸ö½×¶Î£¬²ÅÕæÕý¿ªÊ¼Ö´ÐÐÀàÖж¨ÒåµÄJava³ÌÐò´úÂë»òÕß×Ö½ÚÂë¡£

¹ØÓÚÀà¼ÓÔØµÄ³õʼ»¯½×¶Î£¬ÔÚÐéÄâ»ú¹æ·¶Ñϸñ¹æ¶¨ÁËÓÐÇÒÖ»ÓÐ5ÖÖ³¡¾°±ØÐë¶ÔÀà½øÐгõʼ»¯£º

ʹÓÃnew¹Ø¼ü×ÖʵÀý»¯¶ÔÏóʱ¡¢¶ÁÈ¡»òÕßÉèÖÃÒ»¸öÀàµÄ¾²Ì¬×Ö¶Î(²»°üº¬±àÒëÆÚ³£Á¿)ÒÔ¼°µ÷Óþ²Ì¬·½·¨µÄʱºò£¬±ØÐë´¥·¢Àà¼ÓÔØµÄ³õʼ»¯¹ý³Ì(Àà¼ÓÔØ¹ý³Ì×îÖÕ½×¶Î)¡£

ʹÓ÷´Éä°ü(java.lang.reflect)µÄ·½·¨¶ÔÀà½øÐз´Éäµ÷ÓÃʱ£¬Èç¹ûÀ໹ûÓб»³õʼ»¯£¬ÔòÐèÏȽøÐгõʼ»¯£¬Õâµã¶Ô·´ÉäºÜÖØÒª¡£

µ±³õʼ»¯Ò»¸öÀàµÄʱºò£¬Èç¹ûÆä¸¸À໹û½øÐгõʼ»¯ÔòÐèÏÈ´¥·¢Æä¸¸ÀàµÄ³õʼ»¯¡£

µ±JavaÐéÄâ»úÆô¶¯Ê±£¬Óû§ÐèÒªÖ¸¶¨Ò»¸öÒªÖ´ÐеÄÖ÷Àà(°üº¬main·½·¨µÄÀà)£¬ÐéÄâ»ú»áÏȳõʼ»¯Õâ¸öÖ÷Àà

µ±Ê¹ÓÃJDK 1.7 µÄ¶¯Ì¬ÓïÑÔÖ§³Öʱ£¬Èç¹ûÒ»¸öjava.lang.invoke.MethodHandle ʵÀý×îºó½âÎö½á¹ûΪREF_getStatic¡¢REF_putStatic¡¢REF_invokeStaticµÄ·½·¨¾ä±ú£¬²¢ÇÒÕâ¸ö·½·¨¾ä±ú¶ÔÓ¦ÀàûÓгõʼ»¯Ê±£¬±ØÐë´¥·¢Æä³õʼ»¯(Õâµã¿´²»¶®¾ÍËãÁË£¬ÕâÊÇ1.7µÄÐÂÔöµÄ¶¯Ì¬ÓïÑÔÖ§³Ö£¬Æä¹Ø¼üÌØÕ÷ÊÇËüµÄÀàÐͼì²éµÄÖ÷Ìå¹ý³ÌÊÇÔÚÔËÐÐÆÚ¶ø²»ÊDZàÒëÆÚ½øÐеģ¬ÕâÊÇÒ»¸ö±È½Ï´óµãµÄ»°Ì⣬ÕâÀïÔÝÇÒ´òס)

Àí½â·º»¯µÄClass¶ÔÏóÒýÓÃ

ÓÉÓÚClassµÄÒýÓÃ×ÜÊýÖ¸Ïòij¸öÀàµÄClass¶ÔÏó£¬ÀûÓÃClass¶ÔÏó¿ÉÒÔ´´½¨ÊµÀýÀ࣬ÕâÒ²¾Í×ãÒÔ˵Ã÷Class¶ÔÏóµÄÒýÓÃÖ¸ÏòµÄ¶ÔÏóÈ·ÇеÄÀàÐÍ¡£ÔÚJava SE5ÒýÈë·ºÐͺó£¬Ê¹ÓÃÎÒÃÇ¿ÉÒÔÀûÓ÷ºÐÍÀ´±íʾClass¶ÔÏó¸ü¾ßÌåµÄÀàÐÍ£¬¼´Ê¹ÔÚÔËÐÐÆÚ¼ä»á±»²Á³ý£¬µ«±àÒëÆÚ×ãÒÔÈ·±£ÎÒÃÇʹÓÃÕýÈ·µÄ¶ÔÏóÀàÐÍ¡£ÈçÏ£º

/**
* Created by zejian on 2017/4/30.
* Blog : http://blog.csdn.net/javazejian [Ô­ÎĵØÖ·,Çë×ðÖØÔ­´´]
*/
public class ClazzDemo {

public static void main(String[] args){
//ûÓзºÐÍ
Class intClass = int.class;

//´ø·ºÐ͵ÄClass¶ÔÏó
Class<Integer> integerClass = int.class;

integerClass = Integer.class;

//ûÓзºÐ͵ÄÔ¼Êø,¿ÉÒÔËæÒ⸳ֵ
intClass= double.class;

//±àÒëÆÚ´íÎó,ÎÞ·¨±àÒëͨ¹ý
//integerClass = double.class
}
}

´Ó´úÂë¿ÉÒÔ¿´³ö£¬ÉùÃ÷ÆÕͨµÄClass¶ÔÏó£¬ÔÚ±àÒëÆ÷²¢²»»á¼ì²éClass¶ÔÏóµÄÈ·ÇÐÀàÐÍÊÇ·ñ·ûºÏÒªÇó£¬Èç¹û´æÔÚ´íÎóÖ»ÓÐÔÚÔËÐÐʱ²ÅµÃÒÔ±©Â¶³öÀ´¡£µ«ÊÇͨ¹ý·ºÐÍÉùÃ÷Ö¸Ã÷ÀàÐ͵ÄClass¶ÔÏ󣬱àÒëÆ÷ÔÚ±àÒëÆÚ½«¶Ô´ø·ºÐ͵ÄÀà½øÐжîÍâµÄÀàÐͼì²é£¬È·±£ÔÚ±àÒëÆÚ¾ÍÄܱ£Ö¤ÀàÐ͵ÄÕýÈ·ÐÔ£¬Êµ¼ÊÉÏInteger.class¾ÍÊÇÒ»¸öClass<Integer>ÀàµÄ¶ÔÏó¡£Ãæ¶ÔÏÂÊöÓï¾ä£¬È·Êµ¿ÉÄÜÁîÈËÀ§»ó£¬µ«¸ÃÓï¾äȷʵÊÇÎÞ·¨±àÒëͨ¹ýµÄ¡£

//±àÒëÎÞ·¨Í¨¹ý
Class<Number> numberClass=Integer.class;

ÎÒÃÇ»òÐí»áÏëInteger²»¾ÍÊÇNumberµÄ×ÓÀàÂð£¿È»¶øÊÂʵ²¢·ÇÕâ°ã¼òµ¥£¬±Ï¾¹IntegerµÄClass¶ÔÏó²¢·ÇNumberµÄClass¶ÔÏóµÄ×ÓÀà£¬Ç°ÃæÌáµ½¹ý£¬ËùÓеÄClass¶ÔÏó¶¼Ö»À´Ô´ÓÚClassÀ࣬¿´À´ÊÂʵȷʵÈç´Ë¡£µ±È»ÎÒÃÇ¿ÉÒÔÀûÓÃͨÅä·û¡°?¡±À´½â¾öÎÊÌ⣺

Class<?> intClass = int.class;
intClass = double.class;

ÕâÑùµÄÓï¾ä²¢Ã»ÓÐʲôÎÊÌ⣬±Ï¾¹Í¨Åä·ûÖ¸Ã÷ËùÓÐÀàÐͶ¼ÊÊÓã¬ÄÇôΪʲô²»Ö±½ÓʹÓÃClass»¹ÒªÊ¹ÓÃClass<?>ÄØ£¿ÕâÑù×öµÄºÃ´¦ÊǸæËß±àÒëÆ÷£¬ÎÒÃÇÊÇȷʵÊDzÉÓÃÈÎÒâÀàÐ͵ķºÐÍ£¬¶ø·ÇÍü¼ÇʹÓ÷ºÐÍÔ¼Êø£¬Òò´ËClass<?>×ÜÊÇÓÅÓÚÖ±½ÓʹÓÃClass£¬ÖÁÉÙǰÕßÔÚ±àÒëÆ÷¼ì²éʱ²»»á²úÉú¾¯¸æÐÅÏ¢¡£µ±È»ÎÒÃÇ»¹¿ÉÒÔʹÓÃextends¹Ø¼ü×Ö¸æËß±àÒëÆ÷½ÓÊÕij¸öÀàÐ͵Ä×ÓÀ࣬Èç½â¾öÇ°ÃæNumberÓëIntegerµÄÎÊÌ⣺

//±àÒëͨ¹ý£¡
Class<? extends Number> clazz = Integer.class;
//¸³ÓèÆäËûÀàÐÍ
clazz = double.class;
clazz = Number.class;

ÉÏÊöµÄ´úÂëÊÇÐеÃͨµÄ£¬extends¹Ø¼ü×ÖµÄ×÷ÓÃÊǸæËß±àÒëÆ÷£¬Ö»ÒªÊÇNumberµÄ×ÓÀà¶¼¿ÉÒÔ¸³Öµ¡£ÕâµãÓëÇ°ÃæÖ±½ÓʹÓÃClass<Number>ÊDz»Ò»ÑùµÄ¡£Êµ¼ÊÉÏ£¬Ó¦¸Ãʱ¿Ì¼ÇסÏòClassÒýÓÃÌí¼Ó·ºÐÍÔ¼Êø½ö½öÊÇΪÁËÌṩ±àÒëÆÚÀàÐ͵ļì²é´Ó¶ø±ÜÃ⽫´íÎóÑÓÐøµ½ÔËÐÐʱÆÚ¡£

¹ØÓÚÀàÐÍת»»µÄÎÊÌâ

ÔÚÐí¶àÐèÒªÇ¿ÖÆÀàÐÍת»»µÄ³¡¾°£¬ÎÒÃǸü¶àµÄ×ö·¨ÊÇÖ±½ÓÇ¿ÖÆ×ª»»ÀàÐÍ£º

package com.zejian;

/**
* Created by zejian on 2017/4/30.
* Blog : http://blog.csdn.net/javazejian [Ô­ÎĵØÖ·,Çë×ðÖØÔ­´´]
*/
public class ClassCast {

public void cast(){

Animal animal= new Dog();
//Ç¿ÖÆ×ª»»
Dog dog = (Dog) animal;
}
}

interface Animal{ }

class Dog implements Animal{ }

Ö®Ëù¿ÉÒÔÇ¿ÖÆ×ª»»£¬ÕâµÃ¹é¹¦ÓÚRRTI£¬ÒªÖªµÀÔÚJavaÖУ¬ËùÓÐÀàÐÍת»»¶¼ÊÇÔÚÔËÐÐʱ½øÐÐÕýÈ·ÐÔ¼ì²éµÄ£¬ÀûÓÃRRTI½øÐÐÅжÏÀàÐÍÊÇ·ñÕýÈ·´Ó¶øÈ·±£Ç¿ÖÆ×ª»»µÄÍê³É£¬Èç¹ûÀàÐÍת»»Ê§°Ü£¬½«»áÅ׳öÀàÐÍת»»Òì³£¡£³ýÁËÇ¿ÖÆ×ª»»Í⣬ÔÚJava SE5ÖÐÐÂÔöÒ»ÖÖʹÓÃClass¶ÔÏó½øÐÐÀàÐÍת»»µÄ·½Ê½£¬ÈçÏ£º

Animal animal= new Dog();
//ÕâÁ½¾äµÈͬÓÚDog dog = (Dog) animal;
Class<Dog> dogType = Dog.class;
Dog dog = dogType.cast(animal)

ÀûÓÃClass¶ÔÏóµÄcast·½·¨£¬Æä²ÎÊý½ÓÊÕÒ»¸ö²ÎÊý¶ÔÏó²¢½«Æäת»»ÎªClassÒýÓõÄÀàÐÍ¡£ÕâÖÖ·½Ê½Ëƺõ±È֮ǰµÄÇ¿ÖÆ×ª»»¸üÂ鷳Щ£¬È·ÊµÈç´Ë£¬¶øÇÒµ±ÀàÐͲ»ÄÜÕýȷת»»Ê±£¬ÈÔÈ»»áÅ׳öClassCastExceptionÒì³£¡£Ô´ÂëÈçÏ£º

public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException(cannotCastMsg(obj));
return (T) obj;
}

instanceof ¹Ø¼ü×ÖÓëisInstance·½·¨

¹ØÓÚinstanceof ¹Ø¼ü×Ö£¬Ëü·µ»ØÒ»¸öbooleanÀàÐ͵ÄÖµ£¬ÒâÔÚ¸æËßÎÒÃǶÔÏóÊDz»ÊÇij¸öÌØ¶¨µÄÀàÐÍʵÀý¡£ÈçÏ£¬ÔÚÇ¿ÖÆ×ª»»Ç°ÀûÓÃinstanceof¼ì²âobjÊDz»ÊÇAnimalÀàÐ͵ÄʵÀý¶ÔÏó£¬Èç¹û·µ»ØtrueÔÙ½øÐÐÀàÐÍת»»£¬ÕâÑù¿ÉÒÔ±ÜÃâÅ׳öÀàÐÍת»»µÄÒì³£(ClassCastException)

public void cast2(Object obj){
if(obj instanceof Animal){
Animal animal= (Animal) obj;
}
}

¶øisInstance·½·¨ÔòÊÇClassÀàÖеÄÒ»¸öNative·½·¨£¬Ò²ÊÇÓÃÓÚÅж϶ÔÏóÀàÐ͵ģ¬¿´¸ö¼òµ¥Àý×Ó£º

public void cast2(Object obj){
//instanceof¹Ø¼ü×Ö
if(obj instanceof Animal){
Animal animal= (Animal) obj;
}

//isInstance·½·¨
if(Animal.class.isInstance(obj)){
Animal animal= (Animal) obj;
}
}

ÊÂʵÉÏinstanceOf ÓëisInstance·½·¨²úÉúµÄ½á¹ûÊÇÏàͬµÄ¡£¶ÔÓÚinstanceOfÊǹؼü×ÖÖ»±»ÓÃÓÚ¶ÔÏóÒýÓñäÁ¿£¬¼ì²é×ó±ß¶ÔÏóÊDz»ÊÇÓÒ±ßÀà»ò½Ó¿ÚµÄʵÀý»¯¡£Èç¹û±»²â¶ÔÏóÊÇnullÖµ£¬Ôò²âÊÔ½á¹û×ÜÊÇfalse¡£Ò»°ãÐÎʽ£º

//ÅжÏÕâ¸ö¶ÔÏóÊDz»ÊÇÕâÖÖÀàÐÍ
obj.instanceof(class)

¶øisInstance·½·¨ÔòÊÇClassÀàµÄNative·½·¨£¬ÆäÖÐobjÊDZ»²âÊԵĶÔÏó»òÕß±äÁ¿£¬Èç¹ûobjÊǵ÷ÓÃÕâ¸ö·½·¨µÄclass»ò½Ó¿ÚµÄʵÀý£¬Ôò·µ»Øtrue¡£Èç¹û±»¼ì²âµÄ¶ÔÏóÊÇnull»òÕß»ù±¾ÀàÐÍ£¬ÄÇô·µ»ØÖµÊÇfalse;Ò»°ãÐÎʽÈçÏ£º

//ÅжÏÕâ¸ö¶ÔÏóÄܲ»Äܱ»×ª»¯ÎªÕâ¸öÀà
class.inInstance(obj)

×îºóÕâÀï¸ø³öÒ»¸ö¼òµ¥ÊµÀý£¬ÑéÖ¤isInstance·½·¨ÓëinstanceofµÈ¼ÛÐÔ£º

class A {}

class B extends A {}

public class C {
static void test(Object x) {
print("Testing x of type " + x.getClass());
print("x instanceof A " + (x instanceof A));
print("x instanceof B "+ (x instanceof B));
print("A.isInstance(x) "+ A.class.isInstance(x));
print("B.isInstance(x) " +
B.class.isInstance(x));
print("x.getClass() == A.class " +
(x.getClass() == A.class));
print("x.getClass() == B.class " +
(x.getClass() == B.class));
print("x.getClass().equals(A.class)) "+
(x.getClass().equals(A.class)));
print("x.getClass().equals(B.class)) " +
(x.getClass().equals(B.class)));
}
public static void main(String[] args) {
test(new A());
test(new B());
}
}

Ö´Ðнá¹û£º

Testing x of type class com.zejian.A
x instanceof A true
x instanceof B false //¸¸À಻һ¶¨ÊÇ×ÓÀàµÄij¸öÀàÐÍ
A.isInstance(x) true
B.isInstance(x) false
x.getClass() == A.class true
x.getClass() == B.class false
x.getClass().equals(A.class)) true
x.getClass().equals(B.class)) false
---------------------------------------------
Testing x of type class com.zejian.B
x instanceof A true
x instanceof B true
A.isInstance(x) true
B.isInstance(x) true
x.getClass() == A.class false
x.getClass() == B.class true
x.getClass().equals(A.class)) false
x.getClass().equals(B.class)) true

µ½´Ë¹ØÓÚClass¶ÔÏóÏà¹ØµÄ֪ʶµã¶¼·ÖÎöÍêÁË£¬ÏÂÃæ½«½áºÏClass¶ÔÏóµÄ֪ʶµã·ÖÎö·´Éä¼¼Êõ¡£

Àí½â·´Éä¼¼Êõ

·´Éä»úÖÆÊÇÔÚÔËÐÐ״̬ÖУ¬¶ÔÓÚÈÎÒâÒ»¸öÀ࣬¶¼Äܹ»ÖªµÀÕâ¸öÀàµÄËùÓÐÊôÐԺͷ½·¨£»¶ÔÓÚÈÎÒâÒ»¸ö¶ÔÏ󣬶¼Äܹ»µ÷ÓÃËüµÄÈÎÒâÒ»¸ö·½·¨ºÍÊôÐÔ£¬ÕâÖÖ¶¯Ì¬»ñÈ¡µÄÐÅÏ¢ÒÔ¼°¶¯Ì¬µ÷ÓöÔÏóµÄ·½·¨µÄ¹¦ÄܳÆÎªjavaÓïÑԵķ´Éä»úÖÆ¡£Ò»Ö±ÒÔÀ´·´Éä¼¼Êõ¶¼ÊÇJavaÖеÄÉÁÁÁµã£¬ÕâÒ²ÊÇĿǰ´ó²¿·Ö¿ò¼Ü(Èçspring/MybatisµÈ)µÃÒÔʵÏÖµÄÖ§Öù¡£ÔÚJavaÖУ¬ClassÀàÓëjava.lang.reflectÀà¿âÒ»Æð¶Ô·´Éä¼¼Êõ½øÐÐÁËÈ«Á¦µÄÖ§³Ö¡£ÔÚ·´Éä°üÖУ¬ÎÒÃdz£ÓõÄÀàÖ÷ÒªÓÐConstructorÀà±íʾµÄÊÇClass ¶ÔÏóËù±íʾµÄÀàµÄ¹¹Ôì·½·¨£¬ÀûÓÃËü¿ÉÒÔÔÚÔËÐÐʱ¶¯Ì¬´´½¨¶ÔÏó¡¢Field±íʾClass¶ÔÏóËù±íʾµÄÀàµÄ³ÉÔ±±äÁ¿£¬Í¨¹ýËü¿ÉÒÔÔÚÔËÐÐʱ¶¯Ì¬Ð޸ijÉÔ±±äÁ¿µÄÊôÐÔÖµ(°üº¬private)¡¢Method±íʾClass¶ÔÏóËù±íʾµÄÀàµÄ³ÉÔ±·½·¨£¬Í¨¹ýËü¿ÉÒÔ¶¯Ì¬µ÷ÓöÔÏóµÄ·½·¨(°üº¬private)£¬ÏÂÃæ½«¶ÔÕ⼸¸öÖØÒªÀà½øÐзֱð˵Ã÷¡£

ConstructorÀ༰ÆäÓ÷¨

ConstructorÀà´æÔÚÓÚ·´Éä°ü(java.lang.reflect)ÖУ¬·´Ó³µÄÊÇClass ¶ÔÏóËù±íʾµÄÀàµÄ¹¹Ôì·½·¨¡£»ñÈ¡Constructor¶ÔÏóÊÇͨ¹ýClassÀàÖеķ½·¨»ñÈ¡µÄ£¬ClassÀàÓëConstructorÏà¹ØµÄÖ÷Òª·½·¨ÈçÏ£º

ÏÂÃæ¿´Ò»¸ö¼òµ¥Àý×ÓÀ´Á˽âConstructor¶ÔÏóµÄʹÓãº

package reflect;

import java.io.Serializable;
import java.lang.reflect.Constructor;

/**
* Created by zejian on 2017/5/1.
* Blog : http://blog.csdn.net/javazejian [Ô­ÎĵØÖ·,Çë×ðÖØÔ­´´]
*/
public class ReflectDemo implements Serializable{
public static void main(String[] args) throws Exception {

Class<?> clazz = null;

//»ñÈ¡Class¶ÔÏóµÄÒýÓÃ
clazz = Class.forName("reflect.User");

//µÚÒ»ÖÖ·½·¨£¬ÊµÀý»¯Ä¬ÈϹ¹Ôì·½·¨£¬
User±ØÐëÎ޲ι¹Ô캯Êý,·ñÔò½«Å×Òì³£
User user = (User) clazz.newInstance();
user.setAge(20);
user.setName("Rollen");
System.out.println(user);

System.out.println("--------------------------");

//»ñÈ¡´øString²ÎÊýµÄpublic¹¹Ô캯Êý
Constructor cs1 =clazz.getConstructor(String.class);
//´´½¨User
User user1= (User) cs1.newInstance("xiaolong");
user1.setAge(22);
System.out.println("user1:"+user1.toString());

System.out.println("---------------------------");

//È¡µÃÖ¸¶¨´øintºÍString²ÎÊý¹¹Ô캯Êý,
¸Ã·½·¨ÊÇ˽Óй¹Ôìprivate
Constructor cs2=clazz.getDeclaredConstructor
(int.class,String.class);
//ÓÉÓÚÊÇprivate±ØÐëÉèÖÿɷÃÎÊ
cs2.setAccessible(true);
//´´½¨user¶ÔÏó
User user2= (User) cs2.newInstance(25,"lidakang");
System.out.println("user2:"+user2.toString());

System.out.println("--------------------------");

//»ñÈ¡ËùÓй¹Ôì°üº¬private
Constructor<?> cons[] = clazz.getDeclaredConstructors();
// ²é¿´Ã¿¸ö¹¹Ôì·½·¨ÐèÒªµÄ²ÎÊý
for (int i = 0; i < cons.length; i++) {
//»ñÈ¡¹¹Ô캯Êý²ÎÊýÀàÐÍ
Class<?> clazzs[] = cons[i].getParameterTypes();
System.out.println("¹¹Ô캯Êý["+i+"]:"+cons[i].toString() );
System.out.print("²ÎÊýÀàÐÍ["+i+"]:(");
for (int j = 0; j < clazzs.length; j++) {
if (j == clazzs.length - 1)
System.out.print(clazzs[j].getName());
else
System.out.print(clazzs[j].getName() + ",");
}
System.out.println(")");
}
}
}


class User {
private int age;
private String name;
public User() {
super();
}
public User(String name) {
super();
this.name = name;
}

/**
* ˽Óй¹Ôì
* @param age
* @param name
*/
private User(int age, String name) {
super();
this.age = age;
this.name = name;
}

//..........Ê¡ÂÔset ºÍ get·½·¨
}

ÔËÐнá¹û£º

User [age=20, name=Rollen]
--------------------------------------------
user1:User [age=22, name=xiaolong]
--------------------------------------------
user2:User [age=25, name=lidakang]
--------------------------------------------
¹¹Ô캯Êý[0]:private reflect.User(int,java.lang.String)
²ÎÊýÀàÐÍ[0]:(int,java.lang.String)
¹¹Ô캯Êý[1]:public reflect.User(java.lang.String)
²ÎÊýÀàÐÍ[1]:(java.lang.String)
¹¹Ô캯Êý[2]:public reflect.User()
²ÎÊýÀàÐÍ[2]:()

¹ØÓÚConstructorÀà±¾ÉíһЩ³£Ó÷½·¨ÈçÏÂ(½ö²¿·Ö£¬ÆäËû¿É²éAPI)£¬

´úÂëÑÝʾÈçÏ£º

Constructor cs3=clazz.getDeclaredConstructor
(int.class,String.class);

System.out.println("-----getDeclaringClass-----");
Class uclazz=cs3.getDeclaringClass();
//Constructor¶ÔÏó±íʾµÄ¹¹Ôì·½·¨µÄÀà
System.out.println("¹¹Ôì·½·¨µÄÀà:"+uclazz.getName());

System.out.println("-----getGenericParameterTypes-----");
//¶ÔÏó±íʾ´Ë Constructor ¶ÔÏóËù±íʾµÄ·½·¨µÄÐβÎÀàÐÍ
Type[] tps=cs3.getGenericParameterTypes();
for (Type tp:tps) {
System.out.println("²ÎÊýÃû³Ætp:"+tp);
}
System.out.println("-----getParameterTypes-----");
//»ñÈ¡¹¹Ô캯Êý²ÎÊýÀàÐÍ
Class<?> clazzs[] = cs3.getParameterTypes();
for (Class claz:clazzs) {
System.out.println("²ÎÊýÃû³Æ:"+claz.getName());
}
System.out.println("-----getName-----");
//ÒÔ×Ö·û´®ÐÎʽ·µ»Ø´Ë¹¹Ôì·½·¨µÄÃû³Æ
System.out.println("getName:"+cs3.getName());

System.out.println("-----getoGenericString-----");
//·µ»ØÃèÊö´Ë Constructor µÄ×Ö·û´®£¬ÆäÖаüÀ¨ÀàÐͲÎÊý¡£
System.out.println("getoGenericString():"
+cs3.toGenericString());
/**
Êä³ö½á¹û:
-----getDeclaringClass-----
¹¹Ôì·½·¨µÄÀà:reflect.User
-----getGenericParameterTypes-----
²ÎÊýÃû³Ætp:int
²ÎÊýÃû³Ætp:class java.lang.String
-----getParameterTypes-----
²ÎÊýÃû³Æ:int
²ÎÊýÃû³Æ:java.lang.String
-----getName-----
getName:reflect.User
-----getoGenericString-----
getoGenericString():private reflect.User(int,java.lang.String)
*/

ÆäÖйØÓÚTypeÀàÐÍÕâÀï¼òµ¥ËµÃ÷һϣ¬Type ÊÇ Java ±à³ÌÓïÑÔÖÐËùÓÐÀàÐ͵Ĺ«¹²¸ß¼¶½Ó¿Ú¡£ËüÃǰüÀ¨Ô­Ê¼ÀàÐÍ¡¢²ÎÊý»¯ÀàÐÍ¡¢Êý×éÀàÐÍ¡¢ÀàÐͱäÁ¿ºÍ»ù±¾ÀàÐÍ¡£getGenericParameterTypes Óë getParameterTypes ¶¼ÊÇ»ñÈ¡¹¹³Éº¯ÊýµÄ²ÎÊýÀàÐÍ£¬Ç°Õß·µ»ØµÄÊÇTypeÀàÐÍ£¬ºóÕß·µ»ØµÄÊÇClassÀàÐÍ£¬ÓÉÓÚType¶¥¼¶½Ó¿Ú£¬ClassҲʵÏÖÁ˸ýӿڣ¬Òò´ËClassÀàÊÇTypeµÄ×ÓÀ࣬Type ±íʾµÄÈ«²¿ÀàÐͶøÃ¿¸öClass¶ÔÏó±íʾһ¸ö¾ßÌåÀàÐ͵ÄʵÀý£¬ÈçString.class½ö´ú±íStringÀàÐÍ¡£ÓÉ´Ë¿´À´TypeÓë Class ±íʾÀàÐͼ¸ºõÊÇÏàͬµÄ£¬Ö»²»¹ý Type±íʾµÄ·¶Î§±ÈClassÒª¹ãµÃ¶à¶øÒÑ¡£µ±È»Type»¹ÓÐÆäËû×ÓÀ࣬È磺

TypeVariable£º±íʾÀàÐͲÎÊý£¬¿ÉÒÔÓÐÉϽ磬±ÈÈ磺T extends Number

ParameterizedType£º±íʾ²ÎÊý»¯µÄÀàÐÍ£¬ÓÐԭʼÀàÐͺ;ßÌåµÄÀàÐͲÎÊý£¬±ÈÈ磺List<String>

WildcardType£º±íʾͨÅä·ûÀàÐÍ£¬±ÈÈ磺?, ? extends Number, ? super Integer

ͨ¹ýÒÔÉϵķÖÎö£¬¶ÔÓÚConstructorÀàÒÑÓбȽÏÇåÎúµÄÀí½â£¬ÀûÓúÃClassÀàºÍConstructorÀ࣬ÎÒÃÇ¿ÉÒÔÔÚÔËÐÐʱ¶¯Ì¬´´½¨ÈÎÒâ¶ÔÏ󣬴ӶøÍ»ÆÆ±ØÐëÔÚ±àÒëÆÚÖªµÀÈ·ÇÐÀàÐ͵ÄÕϰ­¡£

FieldÀ༰ÆäÓ÷¨

Field ÌṩÓйØÀà»ò½Ó¿ÚµÄµ¥¸ö×ֶεÄÐÅÏ¢£¬ÒÔ¼°¶ÔËüµÄ¶¯Ì¬·ÃÎÊȨÏÞ¡£·´ÉäµÄ×ֶοÉÄÜÊÇÒ»¸öÀࣨ¾²Ì¬£©×ֶλòʵÀý×ֶΡ£Í¬ÑùµÄµÀÀí£¬ÎÒÃÇ¿ÉÒÔͨ¹ýClassÀàµÄÌṩµÄ·½·¨À´»ñÈ¡´ú±í×Ö¶ÎÐÅÏ¢µÄField¶ÔÏó£¬ClassÀàÓëField¶ÔÏóÏà¹Ø·½·¨ÈçÏ£º

ÏÂÃæµÄ´úÂëÑÝʾÁËÉÏÊö·½·¨µÄʹÓùý³Ì

/**
* Created by zejian on 2017/5/1.
* Blog : http://blog.csdn.net/javazejian [Ô­ÎĵØÖ·,Çë×ðÖØÔ­´´]
*/
public class ReflectField {

public static void main(String[] args) throws ClassNotFoundException,
NoSuchFieldException {
Class<?> clazz = Class.forName("reflect.Student");
//»ñȡָ¶¨×Ö¶ÎÃû³ÆµÄFieldÀà,
×¢Òâ×Ö¶ÎÐÞÊηû±ØÐëΪpublic¶øÇÒ´æÔÚ¸Ã×Ö¶Î,
// ·ñÔòÅ×NoSuchFieldException
Field field = clazz.getField("age");
System.out.println("field:"+field);

//»ñÈ¡ËùÓÐÐÞÊηûΪpublicµÄ×Ö¶Î,°üº¬¸¸Àà×Ö¶Î,×¢ÒâÐÞÊηûΪpublic²Å»á»ñÈ¡
Field fields[] = clazz.getFields();
for (Field f:fields) {
System.out.println("f:"+f.getDeclaringClass());
}

System.out.println
("================getDeclaredFields==============");
//»ñÈ¡µ±Ç°ÀàËù×Ö¶Î(°üº¬private×Ö¶Î),×¢Òâ²»°üº¬¸¸ÀàµÄ×Ö¶Î
Field fields2[] = clazz.getDeclaredFields();
for (Field f:fields2) {
System.out.println("f2:"+f.getDeclaringClass());
}
//»ñȡָ¶¨×Ö¶ÎÃû³ÆµÄFieldÀà,
¿ÉÒÔÊÇÈÎÒâÐÞÊηûµÄ×Ô¶¯,×¢Òâ²»°üº¬¸¸ÀàµÄ×Ö¶Î
Field field2 = clazz.getDeclaredField("desc");
System.out.println("field2:"+field2);
}
/**
Êä³ö½á¹û:
field:public int reflect.Person.age
f:public java.lang.String reflect.Student.desc
f:public int reflect.Person.age
f:public java.lang.String reflect.Person.name

================getDeclaredFields===========
f2:public java.lang.String reflect.Student.desc
f2:private int reflect.Student.score
field2:public java.lang.String reflect.Student.desc
*/
}

class Person{
public int age;
public String name;
//Ê¡ÂÔsetºÍget·½·¨
}

class Student extends Person{
public String desc;
private int score;
//Ê¡ÂÔsetºÍget·½·¨
}

ÉÏÊö·½·¨ÐèҪעÒâµÄÊÇ£¬Èç¹ûÎÒÃDz»ÆÚÍû»ñÈ¡Æä¸¸ÀàµÄ×ֶΣ¬ÔòÐèʹÓÃClassÀàµÄgetDeclaredField/getDeclaredFields·½·¨À´»ñÈ¡×ֶμ´¿É£¬ÌÈÈôÐèÒªÁ¬´ø»ñÈ¡µ½¸¸ÀàµÄ×ֶΣ¬ÄÇôÇëʹÓÃClassÀàµÄgetField/getFields£¬µ«ÊÇÒ²Ö»ÄÜ»ñÈ¡µ½publicÐÞÊεĵÄ×ֶΣ¬ÎÞ·¨»ñÈ¡¸¸ÀàµÄ˽ÓÐ×ֶΡ£ÏÂÃæ½«Í¨¹ýFieldÀà±¾ÉíµÄ·½·¨¶ÔÖ¸¶¨ÀàÊôÐÔ¸³Öµ£¬´úÂëÑÝʾÈçÏ£º

//»ñÈ¡Class¶ÔÏóÒýÓÃ
Class<?> clazz = Class.forName("reflect.Student");

Student st= (Student) clazz.newInstance();
//»ñÈ¡¸¸Ààpublic×ֶβ¢¸³Öµ
Field ageField = clazz.getField("age");
ageField.set(st,18);
Field nameField = clazz.getField("name");
nameField.set(st,"Lily");

//Ö»»ñÈ¡µ±Ç°ÀàµÄ×Ö¶Î,²»»ñÈ¡¸¸ÀàµÄ×Ö¶Î
Field descField = clazz.getDeclaredField("desc");
descField.set(st,"I am student");
Field scoreField = clazz.getDeclaredField("score");
//ÉèÖÿɷÃÎÊ£¬scoreÊÇprivateµÄ
scoreField.setAccessible(true);
scoreField.set(st,88);
System.out.println(st.toString());

//Êä³ö½á¹û£º
Student{age=18, name='Lily ,desc='I am student', score=88}

//»ñÈ¡×Ö¶ÎÖµ
System.out.println(scoreField.get(st));
// 88

ÆäÖеÄset(Object obj, Object value)·½·¨ÊÇFieldÀà±¾ÉíµÄ·½·¨£¬ÓÃÓÚÉèÖÃ×ֶεÄÖµ£¬¶øget(Object obj)ÔòÊÇ»ñÈ¡×ֶεÄÖµ£¬µ±È»¹ØÓÚFieldÀ໹ÓÐÆäËû³£Óõķ½·¨ÈçÏ£º

ÉÏÊö·½·¨¿ÉÄÜÊǽÏΪ³£Óõģ¬ÊÂʵÉÏÔÚÉèÖÃÖµµÄ·½·¨ÉÏ£¬FieldÀ໹ÌṩÁËרÃÅÕë¶Ô»ù±¾Êý¾ÝÀàÐ͵ķ½·¨£¬ÈçsetInt()/getInt()¡¢setBoolean()/getBoolean¡¢setChar()/getChar()µÈµÈ·½·¨£¬ÕâÀï¾Í²»È«²¿ÁгöÁË£¬ÐèҪʱ²éAPIÎĵµ¼´¿É¡£ÐèÒªÌØ±ð×¢ÒâµÄÊDZ»final¹Ø¼ü×ÖÐÞÊεÄField×Ö¶ÎÊǰ²È«µÄ£¬ÔÚÔËÐÐʱ¿ÉÒÔ½ÓÊÕÈκÎÐ޸쬵«×îÖÕÆäʵ¼ÊÖµÊDz»»á·¢Éú¸Ä±äµÄ¡£

MethodÀ༰ÆäÓ÷¨

Method Ìṩ¹ØÓÚÀà»ò½Ó¿ÚÉϵ¥¶Àij¸ö·½·¨£¨ÒÔ¼°ÈçºÎ·ÃÎʸ÷½·¨£©µÄÐÅÏ¢£¬Ëù·´Ó³µÄ·½·¨¿ÉÄÜÊÇÀà·½·¨»òʵÀý·½·¨£¨°üÀ¨³éÏó·½·¨£©¡£ÏÂÃæÊÇClassÀà»ñÈ¡Method¶ÔÏóÏà¹ØµÄ·½·¨£º

ͬÑùͨ¹ý°¸ÀýÑÝʾÉÏÊö·½·¨£º

import java.lang.reflect.Method;

/**
* Created by zejian on 2017/5/1.
* Blog : http://blog.csdn.net/javazejian [Ô­ÎĵØÖ·,Çë×ðÖØÔ­´´]
*/
public class ReflectMethod {


public static void main(String[] args)
throws ClassNotFoundException, NoSuchMethodException {

Class clazz = Class.forName("reflect.Circle");

//¸ù¾Ý²ÎÊý»ñÈ¡publicµÄMethod,°üº¬¼Ì³Ð×Ô¸¸ÀàµÄ·½·¨
Method method = clazz.getMethod("draw",int.class,String.class);

System.out.println("method:"+method);

//»ñÈ¡ËùÓÐpublicµÄ·½·¨:
Method[] methods =clazz.getMethods();
for (Method m:methods){
System.out.println("m::"+m);
}

System.out.println("=========================");

//»ñÈ¡µ±Ç°ÀàµÄ·½·¨°üº¬private,
¸Ã·½·¨ÎÞ·¨»ñÈ¡¼Ì³Ð×Ô¸¸ÀàµÄmethod
Method method1 = clazz.getDeclaredMethod("drawCircle");
System.out.println("method1::"+method1);
//»ñÈ¡µ±Ç°ÀàµÄËùÓз½·¨°üº¬private,
¸Ã·½·¨ÎÞ·¨»ñÈ¡¼Ì³Ð×Ô¸¸ÀàµÄmethod
Method[] methods1=clazz.getDeclaredMethods();
for (Method m:methods1){
System.out.println("m1::"+m);
}
}

/**
Êä³ö½á¹û:
method:public void reflect.Shape.draw(int,java.lang.String)

m::public int reflect.Circle.getAllCount()
m::public void reflect.Shape.draw()
m::public void reflect.Shape.draw(int,java.lang.String)
m::public final void java.lang.Object.wait(long,int)
throws java.lang.InterruptedException
m::public final native void java.lang.Object.wait(long)
throws java.lang.InterruptedException
m::public final void java.lang.Object.wait()
throws java.lang.InterruptedException
m::public boolean java.lang.Object.equals(java.lang.Object)
m::public java.lang.String java.lang.Object.toString()
m::public native int java.lang.Object.hashCode()
m::public final native java.lang.Class java.lang.Object.getClass()
m::public final native void java.lang.Object.notify()
m::public final native void java.lang.Object.notifyAll()

=========================================
method1::private void reflect.Circle.drawCircle()

m1::public int reflect.Circle.getAllCount()
m1::private void reflect.Circle.drawCircle()
*/
}

class Shape {
public void draw(){
System.out.println("draw");
}

public void draw(int count , String name){
System.out.println("draw "+ name +",count="+count);
}

}
class Circle extends Shape{

private void drawCircle(){
System.out.println("drawCircle");
}
public int getAllCount(){
return 100;
}
}

ÔÚͨ¹ýgetMethods·½·¨»ñÈ¡Method¶ÔÏóʱ£¬»á°Ñ¸¸ÀàµÄ·½·¨Ò²»ñÈ¡µ½£¬ÈçÉϵÄÊä³ö½á¹û£¬°ÑObjectÀàµÄ·½·¨¶¼´òÓ¡³öÀ´ÁË¡£¶øgetDeclaredMethod/getDeclaredMethods·½·¨¶¼Ö»ÄÜ»ñÈ¡µ±Ç°ÀàµÄ·½·¨¡£ÎÒÃÇÔÚʹÓÃʱ¸ù¾ÝÇé¿öÑ¡Ôñ¼´¿É¡£ÏÂÃæ½«ÑÝʾͨ¹ýMethod¶ÔÏóµ÷ÓÃÖ¸¶¨ÀàµÄ·½·¨£º

Class clazz = Class.forName("reflect.Circle");
//´´½¨¶ÔÏó
Circle circle = (Circle) clazz.newInstance();

//»ñȡָ¶¨²ÎÊýµÄ·½·¨¶ÔÏóMethod
Method method = clazz.getMethod("draw",int.class,String.class);

//ͨ¹ýMethod¶ÔÏóµÄinvoke(Object obj,Object... args)·½·¨µ÷ÓÃ
method.invoke(circle,15,"ȦȦ");

//¶Ô˽ÓÐÎ޲η½·¨µÄ²Ù×÷
Method method1 = clazz.getDeclaredMethod("drawCircle");
//ÐÞ¸Ä˽Óз½·¨µÄ·ÃÎʱêʶ
method1.setAccessible(true);
method1.invoke(circle);

//¶ÔÓзµ»ØÖµµÃ·½·¨²Ù×÷
Method method2 =clazz.getDeclaredMethod("getAllCount");
Integer count = (Integer) method2.invoke(circle);
System.out.println("count:"+count);

/**
Êä³ö½á¹û:
draw ȦȦ,count=15
drawCircle
count:100
*/

ÔÚÉÏÊö´úÂëÖе÷Ó÷½·¨£¬Ê¹ÓÃÁËMethodÀàµÄinvoke(Object obj,Object... args)µÚÒ»¸ö²ÎÊý´ú±íµ÷ÓõĶÔÏ󣬵ڶþ¸ö²ÎÊý´«µÝµÄµ÷Ó÷½·¨µÄ²ÎÊý¡£ÕâÑù¾ÍÍê³ÉÁËÀà·½·¨µÄ¶¯Ì¬µ÷Óá£

getReturnType·½·¨/getGenericReturnType·½·¨¶¼ÊÇ»ñÈ¡Method¶ÔÏó±íʾµÄ·½·¨µÄ·µ»ØÀàÐÍ£¬Ö»²»¹ýǰÕß·µ»ØµÄClassÀàÐͺóÕß·µ»ØµÄType(Ç°ÃæÒÑ·ÖÎö¹ý)£¬Type¾ÍÊÇÒ»¸ö½Ó¿Ú¶øÒÑ£¬ÔÚJava8ÖÐÐÂÔöÒ»¸öĬÈϵķ½·¨ÊµÏÖ£¬·µ»ØµÄ¾Í²ÎÊýÀàÐÍÐÅÏ¢

public interface Type {
//1.8ÐÂÔö
default String getTypeName() {
return toString();
}
}

¶øgetParameterTypes/getGenericParameterTypesÒ²ÊÇͬÑùµÄµÀÀí£¬¶¼ÊÇ»ñÈ¡Method¶ÔÏóËù±íʾµÄ·½·¨µÄ²ÎÊýÀàÐÍ£¬ÆäËû·½·¨ÓëÇ°ÃæµÄFieldºÍConstructorÊÇÀàËÆµÄ¡£

·´Éä°üÖеÄArrayÀà

ÔÚJavaµÄjava.lang.reflect°üÖдæÔÚ×ÅÒ»¸ö¿ÉÒÔ¶¯Ì¬²Ù×÷Êý×éµÄÀ࣬Array£¬ËüÌṩÁ˶¯Ì¬´´½¨ºÍ·ÃÎÊ Java Êý×éµÄ·½·¨¡£Array ÔÊÐíÔÚÖ´ÐÐ get »ò set ²Ù×÷½øÐÐȡֵºÍ¸³Öµ¡£ÔÚClassÀàÖÐÓëÊý×鹨ÁªµÄ·½·¨ÊÇ£º

java.lang.reflect.ArrayÖеij£Óþ²Ì¬·½·¨ÈçÏ£º

ÏÂÃæÍ¨¹ýÒ»¸ö¼òµ¥Àý×ÓÀ´ÑÝʾÕâЩ·½·¨

package reflect;

import java.lang.reflect.Array;

/**
* Created by zejian on 2017/5/1.
* Blog : http://blog.csdn.net/javazejian [Ô­ÎĵØÖ·,Çë×ðÖØÔ­´´]
*/
public class ReflectArray {

public static void main(String[] args)
throws ClassNotFoundException {
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//»ñÈ¡Êý×éÀàÐ͵ÄClass ¼´int.class
Class<?> clazz = array.getClass().getComponentType();
//´´½¨Ò»¸ö¾ßÓÐÖ¸¶¨µÄ×é¼þÀàÐͺͳ¤¶ÈµÄÐÂÊý×é¡£
//µÚÒ»¸ö²ÎÊý:Êý×éµÄÀàÐÍ,µÚ¶þ¸ö²ÎÊý:Êý×éµÄ³¤¶È
Object newArr = Array.newInstance(clazz, 15);
//»ñȡԭÊý×éµÄ³¤¶È
int co = Array.getLength(array);
//¸³ÖµÔ­Êý×éµ½ÐÂÊý×é
System.arraycopy(array, 0, newArr, 0, co);
for (int i:(int[]) newArr) {
System.out.print(i+",");
}

//´´½¨ÁËÒ»¸ö³¤¶ÈΪ10 µÄ×Ö·û´®Êý×飬
//½Ó×ŰÑË÷ÒýλÖÃΪ6 µÄÔªËØÉèΪ"hello world!"£¬
È»ºóÔÙ¶ÁÈ¡Ë÷ÒýλÖÃΪ6 µÄÔªËØµÄÖµ
Class clazz2 = Class.forName("java.lang.String");

//´´½¨Ò»¸ö³¤¶ÈΪ10µÄ×Ö·û´®Êý×飬
ÔÚJavaÖÐÊý×éÒ²¿ÉÒÔ×÷ΪObject¶ÔÏó
Object array2 = Array.newInstance(clazz2, 10);

//°Ñ×Ö·û´®Êý×é¶ÔÏóµÄË÷ÒýλÖÃΪ6µÄÔªËØÉèÖÃΪ"hello"
Array.set(array2, 6, "hello world!");

//»ñµÃ×Ö·û´®Êý×é¶ÔÏóµÄË÷ÒýλÖÃΪ5µÄÔªËØµÄÖµ
String str = (String)Array.get(array2, 6);
System.out.println();
System.out.println(str);//hello
}
/**
Êä³ö½á¹û:
1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,
hello world!
*/
}

ͨ¹ýÉÏÊö´úÂëÑÝʾ£¬È·Êµ¿ÉÒÔÀûÓÃArrayÀàºÍ·´ÉäÏà½áºÏ¶¯Ì¬´´½¨Êý×飬Ҳ¿ÉÒÔÔÚÔËÐÐʱ¶¯Ì¬»ñÈ¡ºÍÉèÖÃÊý×éÖÐÔªËØµÄÖµ£¬Æäʵ³ýÁËÉϵÄset/getÍâArray»¹×¨ÃÅΪ8ÖÖ»ù±¾Êý¾ÝÀàÐÍÌá¹©ÌØÓеķ½·¨£¬ÈçsetInt/getInt¡¢setBoolean/getBoolean£¬ÆäËûÒÀ´ÎÀàÍÆ£¬ÐèҪʹÓÃÊÇ¿ÉÒԲ鿴APIÎĵµ¼´¿É¡£³ýÁËÉÏÊö¶¯Ì¬ÐÞ¸ÄÊý×鳤¶È»òÕß¶¯Ì¬´´½¨Êý×é»ò¶¯Ì¬»ñȡֵ»òÉèÖÃÖµÍ⣬¿ÉÒÔÀûÓ÷ºÐͶ¯Ì¬´´½¨·ºÐÍÊý×éÈçÏ£º

/**
* ½ÓÊÕÒ»¸ö·ºÐÍÊý×飬
È»ºó´´½¨Ò»¸ö³¤¶ÈÓë½ÓÊÕµÄÊý×鳤¶ÈÒ»ÑùµÄ·ºÐÍÊý×飬
* ²¢°Ñ½ÓÊÕµÄÊý×éµÄÔªËØ¸´ÖƵ½Ð´´½¨µÄÊý×éÖУ¬
* ×îºóÕÒ³öÐÂÊý×éÖеÄ×îÐ¡ÔªËØ£¬²¢´òÓ¡³öÀ´
* @param a
* @param <T>
*/
public <T extends Comparable<T>> void min(T[] a) {
//ͨ¹ý·´Éä´´½¨ÏàͬÀàÐ͵ÄÊý×é
T[] b = (T[]) Array.newInstance
(a.getClass().getComponentType(), a.length);
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
T min = null;
boolean flag = true;
for (int i = 0; i < b.length; i++) {
if (flag) {
min = b[i];
flag = false;
}
if (b[i].compareTo(min) < 0) {
min = b[i];
}
}
System.out.println(min);
}

±Ï¾¹ÎÒÃÇÎÞ·¨Ö±½Ó´´½¨·ºÐÍÊý×飬ÓÐÁËArrayµÄ¶¯Ì¬´´½¨Êý×éµÄ·½Ê½Õâ¸öÎÊÌâÒ²¾ÍÓ­Èжø½âÁË¡£

//ÎÞЧÓï¾ä£¬±àÒ벻ͨ
T[] a = new T[];

ok~£¬µ½Õâ·´ÉäÖм¸¸öÖØÒª²¢ÇÒ³£ÓõÄÀàÎÒÃǶ¼»ù±¾½éÉÜÍêÁË£¬µ«¸üÖØÒªÊÇ£¬ÎÒÃÇÓ¦¸ÃÈÏʶµ½·´Éä»úÖÆ²¢Ã»ÓÐʲôÉñÆæÖ®´¦¡£µ±Í¨¹ý·´ÉäÓëÒ»¸öδ֪ÀàÐ͵ĶÔÏó´ò½»µÀʱ£¬JVMÖ»»á¼òµ¥µØ¼ì²éÕâ¸ö¶ÔÏó£¬ÅжϸöÔÏóÊôÓÚÄÇÖÖÀàÐÍ£¬Í¬Ê±Ò²Ó¦¸ÃÖªµÀ£¬ÔÚʹÓ÷´Éä»úÖÆ´´½¨¶ÔÏóǰ£¬±ØÐëÈ·±£ÒѼÓÔØÁËÕâ¸öÀàµÄClass¶ÔÏ󣬵±È»ÕâµãÍêÈ«²»±ØÓÉÎÒÃDzÙ×÷£¬±Ï¾¹Ö»ÄÜJVM¼ÓÔØ£¬µ«±ØÐëÈ·±£¸ÃÀàµÄ¡±.class¡±ÎļþÒÑ´æÔÚ²¢ÇÒJVMÄܹ»ÕýÈ·ÕÒµ½¡£¹ØÓÚClassÀàµÄ·½·¨ÔÚÇ°ÃæÎÒÃÇÖ»ÊÇ·ÖÎöÁËÖ÷ÒªµÄһЩ·½·¨£¬ÆäʵClassÀàµÄAPI·½·¨Í¦¶àµÄ£¬½¨Òé²é¿´Ò»ÏÂAPIÎĵµ£¬ä¯ÀÀÒ»±é£¬ÓиöÓ¡ÏóÒ²ÊDz»´íµÄÑ¡Ôñ£¬ÕâÀï½öÁгöÇ°ÃæÃ»ÓнéÉܹýÓÖ¿ÉÄÜÓõ½µÄAPI£º

/**
* ÐÞÊηû¡¢¸¸ÀࡢʵÏֵĽӿڡ¢×¢½âÏà¹Ø
*/

//»ñÈ¡ÐÞÊηû£¬·µ»ØÖµ¿Éͨ¹ýModifierÀà½øÐнâ¶Á
public native int getModifiers();
//»ñÈ¡¸¸À࣬Èç¹ûΪObject£¬¸¸ÀàΪnull
public native Class<? super T> getSuperclass();
//¶ÔÓÚÀ࣬Ϊ×Ô¼ºÉùÃ÷ʵÏÖµÄËùÓнӿڣ¬¶ÔÓÚ½Ó¿Ú£¬
Ϊֱ½ÓÀ©Õ¹µÄ½Ó¿Ú£¬²»°üÀ¨Í¨¹ý¸¸Àà¼ä½Ó¼Ì³ÐÀ´µÄ
public native Class<?>[] getInterfaces();
//×Ô¼ºÉùÃ÷µÄ×¢½â
public Annotation[] getDeclaredAnnotations();
//ËùÓеÄ×¢½â£¬°üÀ¨¼Ì³ÐµÃµ½µÄ
public Annotation[] getAnnotations();
//»ñÈ¡»ò¼ì²éÖ¸¶¨ÀàÐ͵Ä×¢½â£¬°üÀ¨¼Ì³ÐµÃµ½µÄ
public <A extends Annotation>
A getAnnotation(Class<A> annotationClass);
public boolean isAnnotationPresent
(Class<? extends Annotation> annotationClass);

/**
* ÄÚ²¿ÀàÏà¹Ø
*/
//»ñÈ¡ËùÓеÄpublicµÄÄÚ²¿ÀàºÍ½Ó¿Ú£¬°üÀ¨´Ó¸¸Àà¼Ì³ÐµÃµ½µÄ
public Class<?>[] getClasses();
//»ñÈ¡×Ô¼ºÉùÃ÷µÄËùÓеÄÄÚ²¿ÀàºÍ½Ó¿Ú
public Class<?>[] getDeclaredClasses();
//Èç¹ûµ±Ç°ClassΪÄÚ²¿À࣬»ñÈ¡ÉùÃ÷¸ÃÀàµÄ×îÍⲿµÄClass¶ÔÏó
public Class<?> getDeclaringClass();
//Èç¹ûµ±Ç°ClassΪÄÚ²¿À࣬»ñȡֱ½Ó°üº¬¸ÃÀàµÄÀà
public Class<?> getEnclosingClass();
//Èç¹ûµ±Ç°ClassΪ±¾µØÀà»òÄäÃûÄÚ²¿À࣬·µ»Ø°üº¬ËüµÄ·½·¨
public Method getEnclosingMethod();

/**
* Class¶ÔÏóÀàÐÍÅжÏÏà¹Ø
*/
//ÊÇ·ñÊÇÊý×é
public native boolean isArray();
//ÊÇ·ñÊÇ»ù±¾ÀàÐÍ
public native boolean isPrimitive();
//ÊÇ·ñÊǽӿÚ
public native boolean isInterface();
//ÊÇ·ñÊÇö¾Ù
public boolean isEnum();
//ÊÇ·ñÊÇ×¢½â
public boolean isAnnotation();
//ÊÇ·ñÊÇÄäÃûÄÚ²¿Àà
public boolean isAnonymousClass();
//ÊÇ·ñÊdzÉÔ±Àà
public boolean isMemberClass();
//ÊÇ·ñÊDZ¾µØÀà
public boolean isLocalClass();

   
2703 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö