
嘻道奇闻
- 文章199742
- 阅读14625734
Java反射必学:Class对象的10个核心方法详解与应用场景
"鍝庯紒鍚浣犳兂鎼濲ava楂樼骇寮€鍙戯紵鍙嶅皠杩欏叧涓嶈繃鍙笉琛屽晩锛? 浠婂ぉ鍜变滑灏辨潵鑱婅亰閭d釜璁╂柊鎵嬫姄鐙傘€佽€佹墜鐖变笉閲婃墜鐨凜lass瀵硅薄銆傚埆鎱岋紝鎴戜繚璇佺敤澶х櫧璇濈粰浣犺鏄庣櫧锛岀湅瀹屼繚鍑嗕綘鑳藉湪鍚屼簨闈㈠墠鍢氱憻涓ゅ彞锛?/p>
涓€銆佸厛鏁存槑鐧斤細Class瀵硅薄鍒板簳鏄釜鍟ョ帺鎰忓効锛?/h3>
锛堟暡榛戞澘锛夋兂璞′綘缃戣喘浜嗕釜鏈哄櫒浜虹帺鍏凤紝鏀跺埌鐨勬槸涓揩閫掔洅瀵瑰惂锛烠lass瀵硅薄灏卞儚杩欎釜蹇€掔洅涓婄殑蹇€掑崟鈥斺€旇櫧鐒跺畠鏈韩涓嶆槸鏈哄櫒浜猴紝浣嗚兘鍛婅瘔浣犲寘瑁归噷鏈変粈涔堥浂浠躲€佹€庝箞缁勮銆傚湪Java閲岋紝姣忎釜绫昏鍔犺浇鏃讹紝JVM閮戒細缁欏畠璐翠釜"蹇€掑崟"锛岃繖灏辨槸Class瀵硅薄銆?/p>
鈥?strong>鈥嬩笁涓噸瑕佸父璇嗗厛璁扮墷锛氣€?/strong>鈥?/p>
- 姣忎釜绫绘湁涓斿彧鏈変竴涓狢lass瀵硅薄
- 鑾峰彇Class瀵硅薄鐨勪笁绉嶅Э鍔匡細
绫诲悕.class
锛堟渶鐩存帴锛?/li>瀵硅薄.getClass()
锛堟渶甯哥敤锛?/li>Class.forName("鍖呭悕.绫诲悕")
锛堟渶鐏垫椿锛?/li>
- 鍙嶅皠鏈哄埗鐨勫叆鍙e氨鏄繖璐э紒
涓句釜鏍楀瓙馃尠锛氬亣璁炬湁涓猆ser绫伙紝鎯虫嬁鍒板畠鐨凜lass瀵硅薄锛?/p>
java澶嶅埗// 鏂规硶1锛氱洿鎺ユ€肩被鍚?/span> Class<?> clazz1 = User.class; // 鏂规硶2锛氶€氳繃瀵硅薄鍙嶆煡 User user = new User(); Class<?> clazz2 = user.getClass(); // 鏂规硶3锛氬姩鎬佸姞杞斤紙灏忓績ClassNotFoundException锛侊級 Class<?> clazz3 = Class.forName("com.example.User");
浜屻€?0澶ф牳蹇冩柟娉曞疄鎿嶆墜鍐?/h3>
锛堟敞鎰忓暒锛佸墠鏂归珮鑳藉共璐э紒锛夊挶浠妸杩欎簺鏂规硶鍒嗘垚鍥涘ぇ闂ㄦ淳锛屼繚璇佷綘璁拌捣鏉ヤ笉璐瑰姴銆?/p>
鈻?鎯呮姤渚﹀療缁?/h4>
鈥?strong>鈥?. getName()鈥?/strong>鈥?br/> 杩欒揣灏卞儚鏌ユ埛鍙o細"浣犲彨鍟ュ悕鍎匡紵"
java澶嶅埗String className = clazz.getName(); // 杩斿洖鍏ㄩ檺瀹氬悕com.example.User
鈥?strong>鈥?. getSimpleName()鈥?/strong>鈥?br/> 姣斾笂闈㈤偅浣嶅疄鍦紝鐩存帴鎶ュ皬鍚嶏細
java澶嶅埗String shortName = clazz.getSimpleName(); // 杩斿洖User
鈥?strong>鈥?. getPackage()鈥?/strong>鈥?br/> 鏌ユ埛鍙e崌绾х増鈥斺€旈棶绫嶈疮锛?/p>
java澶嶅埗Package pkg = clazz.getPackage(); // 鎷垮埌鍖呬俊鎭?/span>
鈥?strong>鈥嬪疄鎴樺満鏅€?/strong>鈥嬶細鍐欓€氱敤鏃ュ織宸ュ叿鏃讹紝鑷姩鑾峰彇褰撳墠绫诲悕鎵搇og锛屾瘮鎵嬪姩鍐欑被鍚嶉潬璋卞浜嗗鍚э紵
鈻?浜哄憳鎺掓煡缁?/h4>
鈥?strong>鈥?. getDeclaredFields()鈥?/strong>鈥?br/> 鎶婄被鐨勬墍鏈夊瓧娈碉紙鍖呮嫭private鐨勶級閮界粰浣犳墥鎷夊嚭鏉ワ細
java澶嶅埗Field[] fields = clazz.getDeclaredFields();
鈥?strong>鈥?. getMethods()鈥?/strong>鈥?br/> 娉ㄦ剰杩欒揣浼氭妸鐖剁被鐨勬柟娉曚篃鎹庡甫涓婏紒杩斿洖鎵€鏈塸ublic鏂规硶锛?/p>
java澶嶅埗Method[] methods = clazz.getMethods();
鈥?strong>鈥?. getDeclaredConstructors()鈥?/strong>鈥?br/> 鏋勯€犲嚱鏁扮殑绉樺瘑妗f锛宲rivate鐨勪篃涓嶆斁杩囷細
java澶嶅埗Constructor<?>[] constructors = clazz.getDeclaredConstructors();
鈥?strong>鈥嬮伩鍧戞寚鍗椻€?/strong>鈥嬶細鑾峰彇绉佹湁鎴愬憳璁板緱鍏堣皟鐢?code>setAccessible(true)锛屼笉鐒剁瓑鐫€鍚僆llegalAccessException鍚э紒
鈻?瀹炴垬绐佸嚮缁?/h4>
鈥?strong>鈥?. newInstance()鈥?/strong>鈥?锛圝DK9寮€濮嬪簾寮冿紝浣嗗緢澶氳€侀」鐩繕鍦ㄧ敤锛?br/> 缁忓吀鍙嶅皠鍒涘缓瀵硅薄锛?/p>
java澶嶅埗User user = (User) clazz.newInstance();
鈥?strong>鈥?. getDeclaredConstructor().newInstance()鈥?/strong>鈥?br/> 姝g‘鐨勬柊濮垮娍锛?/p>
java澶嶅埗Constructor<?> constructor = clazz.getDeclaredConstructor(); User user = (User) constructor.newInstance();
鈥?strong>鈥?. getMethod() + invoke()鈥?/strong>鈥?br/> 鍔ㄦ€佽皟鐢ㄦ柟娉曠殑榛勯噾缁勫悎锛?/p>
java澶嶅埗Method method = clazz.getMethod("setName", String.class); method.invoke(user, "寮犲皬榫?);
鈥?strong>鈥嬬湡瀹炴渚嬧€?/strong>鈥嬶細褰撳勾鍋氳嚜鍔ㄥ寲娴嬭瘯妗嗘灦锛屽氨鏄潬杩欐嫑鍔ㄦ€佽皟鐢ㄤ笉鍚岀増鏈帴鍙g殑锛?/p>
鈻?鐗规畩鎶€鑳界粍
鈥?strong>鈥?0. isInterface()鈥?/strong>鈥?br/> 閴村埆韬唤鐨勭鍣ㄢ€斺€斿垽鏂槸涓嶆槸鎺ュ彛锛?/p>
java澶嶅埗boolean isInterface = clazz.isInterface();
鈥?strong>鈥嬪喎鐭ヨ瘑鈥?/strong>鈥嬶細鏁扮粍绫诲瀷涔熸湁Class瀵硅薄锛?code>String[].class.isArray()浼氳繑鍥瀟rue鍝
涓夈€佷釜浜虹鎴跨粡楠屽寘
锛堟帍蹇冪獫瀛愭椂闂村埌锛侊級鐢ㄤ簡杩欎箞澶氬勾鍙嶅皠锛岃鍑犵偣浣犱滑鍦ㄦ枃妗i噷缁濆鐪嬩笉鍒扮殑锛?/p>
-
鈥?strong>鈥嬫€ц兘杩欎釜浜嬪効鈥?/strong>鈥嬶細鍒竴鍚弽灏勬參灏卞搯鍡︼紒鐜板湪鐨凧VM浼樺寲寰堢粰鍔涳紝鍙涓嶆槸寰幆閲岀柉鐙傝皟鐢紝鏍规湰鎰熻涓嶅嚭鏉ャ€備絾瑕佹槸鍋氶珮棰戜氦鏄撶郴缁?..閭e挶杩樻槸鎮犵潃鐐?/p>
-
鈥?strong>鈥嬪畨鍏ㄧ孩绾库€?/strong>鈥嬶細鍓嶆鏃堕棿鍥㈤槦鏂颁汉鐢ㄥ弽灏勭‖鏀筍pring瀹瑰櫒閲岀殑Bean锛屽樊鐐瑰紩鍙戠嚎涓婁簨鏁咃紒璁颁綇锛氳秺寮哄ぇ鐨勮兘鍔涳紝璐d换瓒婂ぇ
-
鈥?strong>鈥嬫鏋惰璁″摬瀛︹€?/strong>鈥嬶細浣犵湅Spring鐨処oC瀹瑰櫒銆丮yBatis鐨凪apper鍔ㄦ€佷唬鐞嗭紝鍝釜绂诲緱寮€鍙嶅皠锛熶絾浜哄閮藉仛浜嗙紦瀛樻満鍒垛€斺€旇繖璇存槑鍟ワ紵鈥?strong>鈥嬪弽灏勮鐢ㄥ湪鍒€鍒冧笂鈥?/strong>鈥?/p>
-
鈥?strong>鈥嬮獨鎿嶄綔棰勮鈥?/strong>鈥嬶細瑙佽繃鏈変汉鐢ㄥ弽灏勪慨鏀筬inal瀛楁鐨勫€煎悧锛熻兘鏄兘锛屼絾灏卞儚鐢ㄦ敼閿ユ崊鎻掑骇鈥斺€旇兘浜紝浣嗗彲鑳戒細鐐革紒
鍥涖€佸埌搴曡涓嶈鐢ㄥ弽灏勶紵
锛堟渶鍚庤鐐瑰ぇ瀹炶瘽锛夋柊浜哄父闂細"鏃㈢劧鍙嶅皠杩欎箞鍗遍櫓锛屼负鍟ヨ繕瑕佸锛? 杩欏氨濂芥瘮闂?鑿滃垁浼氬垏鎵嬩负鍟ヨ繕瑕佺敤"鈥斺€斿叧閿湅鍦烘櫙锛?/p>
鈥?strong>鈥嬫帹鑽愪娇鐢ㄥ満鏅€?/strong>鈥嬶細
鉁?妗嗘灦寮€鍙戯紙姣斿鑷繁鍐欎釜绠€鏄撶増Spring锛?br/>
鉁?鍔ㄦ€佷唬鐞嗭紙AOP鐨勫疄鐜板熀纭€锛?br/>
鉁?閫氱敤宸ュ叿绫伙紙姣斿閭d釜鑷姩鐢熸垚SQL鐨凚aseDao锛?/p>
鈥?strong>鈥嬪姖閫€鍦烘櫙鈥?/strong>鈥嬶細
鉂?涓氬姟浠g爜閲岀‖绉€鎶€鏈?br/>
鉂?鎬ц兘鏁忔劅鐨勬牳蹇冩ā鍧?br/>
鉂?闇€瑕佷弗鏍煎畨鍏ㄦ帶鍒剁殑鍦烘櫙
璁颁綇鍠斤細鍙嶅皠灏卞儚杈f鈥斺€旈€傞噺鎻愬懗锛岃繃閲忎激韬€傜敤濂戒簡鏄敠涓婃坊鑺憋紝鐢ㄩ敊浜?..绛夌潃鍗婂鎺ユ姤璀︾數璇濆惂锛?锛堝埆闂垜鎬庝箞鐭ラ亾鐨凾_T锛?/p>
銆愬叏鏂囧畬銆?/p>