
嘻道奇闻
- 文章199742
- 阅读14625734
Android Java开发必备:Class对象操作类信息的5大实战技巧
"鎴戞摝锛佸啓涓伐鍏风被杩樿鎵嬪姩缁存姢绫讳俊鎭紵娲昏浣犲ぉ澶╁姞鐝紒" 浠婂ぉ鍜变滑鎼炵偣楂樼骇鎿嶄綔锛屾暀浣犳妸Class瀵硅薄鐜╁嚭鑺辨潵銆傚惉璇存帉鎻¤繖浜旀嫑鐨勫紑鍙戣€咃紝璋冭瘯鏃堕棿閮借兘鐮嶅崐鈥斺€旂湡鐨勫亣鐨勶紵鐪嬪畬浣犲氨鐭ラ亾锛?/p>
馃殌 鎶€宸т竴锛氫笁绉嶅Э鍔胯幏鍙朇lass瀵硅薄锛堝埆鍙細鐢?class锛侊級
锛堟暡榛戞澘锛夊垰鍏ラ棬鐨勫皬鐧芥€婚棶锛?涓哄暐鎴慻etClass()鏈夋椂鍊欐姤NPE锛? 鏉ワ紒瀵圭収杩欏紶瀵规瘮琛細
鑾峰彇鏂瑰紡 | 閫傜敤鍦烘櫙 | 缈昏溅椋庨櫓鐐?/th> |
---|---|---|
绫诲悕.class | 鏄庣‘鐭ラ亾鍏蜂綋绫?/td> | 鍐呴儴绫昏鍔?绗﹀彿 |
瀵硅薄.getClass() | 宸叉湁瀵硅薄瀹炰緥鏃?/td> | 瀵硅薄鍙兘涓簄ull瀵艰嚧NPE |
Class.forName() | 鍔ㄦ€佸姞杞界被锛堝鎻掍欢鍖栵級 | 绫讳笉瀛樺湪鐩存帴宕╂簝 |
鈥?strong>鈥嬮伩鍧戠粷鎷涒€?/strong>鈥嬶細
鐢ㄤ笁鍏冭繍绠楃淇濆懡锛?/p>
java澶嶅埗Class<?> clazz = (obj != null) ? obj.getClass() : TargetClass.class;
涓婁釜鏈堢粍閲屾柊浜哄繕璁板垽绌猴紝鐩存帴瀵艰嚧绾夸笂鏀粯鍔熻兘鐦棯23鍒嗛挓锛岃娣嬫穻鐨勬暀璁晩锛?/p>
馃洜锔?鎶€宸т簩锛氬姩鎬佽幏鍙栨柟娉曪紙姣攊f-else棣欏浜嗭級
"鏂规硶鍚嶈€佹槸璁伴敊鎬庝箞鍔烇紵" 鈥斺€斿弽灏勬不濂戒簡鎴戠殑鍛藉悕鍥伴毦鐥囷紒鐪嬭繖娈电鎿嶄綔锛?/p>
java澶嶅埗// 鑾峰彇鎵€鏈夊叕寮€鏂规硶锛堝寘鎷埗绫荤殑锛?/span> Method[] methods = clazz.getMethods(); // 绮惧噯鎹曡幏鐗瑰畾鏂规硶锛堝弬鏁扮被鍨嬭瀵归綈锛侊級 Method method = clazz.getDeclaredMethod("formatDate", Context.class, long.class); // 绐佺牬private灏佸嵃 method.setAccessible(true);
鈥?strong>鈥嬬湡瀹炴渚嬧€?/strong>鈥嬶細鍘诲勾鍋氳法妯″潡璋冪敤鏃讹紝鐢ㄨ繖鎷涘姩鎬佽皟鐢ㄤ笉鍚岀増鏈珹PI锛屽吋瀹规€ч€傞厤鏃堕棿浠?鍛ㄥ帇缂╁埌3澶╋紒
馃攳 鎶€宸т笁锛氬唴閮ㄧ被澶勭悊绉樿瘈锛?0%浜鸿俯杩囩殑鍧戯級
"鏄庢槑鐓х潃鏂囨。鍐欑殑锛屾€庝箞鎶lassNotFoundException锛? 澶氬崐鏄唴閮ㄧ被鐨?绗﹀彿鍦ㄤ綔濡栵紒
鈥?strong>鈥嬫纭墦寮€鏂瑰紡鈥?/strong>鈥嬶細
java澶嶅埗// 鏅€氬唴閮ㄧ被 Class<?> innerClazz = OuterClass.InnerClass.class; // 鍖垮悕鍐呴儴绫伙紙娉ㄦ剰$1鐨勭巹鏈猴級 Class<?> anonymousClazz = OuterClass$1.class;
鈥?strong>鈥嬮獨鎿嶄綔鈥?/strong>鈥嬶細鍔ㄦ€佸姞杞藉唴閮ㄧ被鏃讹紝璁板緱鐢ㄢ€?strong>鈥媑etDeclaredClasses()鈥?/strong>鈥嬪厛鎺㈣矾锛?/p>
java澶嶅埗Class<?>[] innerClasses = outerClazz.getDeclaredClasses(); Arrays.stream(innerClasses).forEach(c -> System.out.println(c.getSimpleName()));
鈿?鎶€宸у洓锛氭€ц兘浼樺寲涓夋澘鏂э紙鍙嶅皠涓嶆槸娲按鐚涘吔锛?/h3>
鎬绘湁浜鸿鍙嶅皠鎱㈠緱鍍忚湕鐗涳紵閭f槸浣犳病鐢ㄥ鏂规硶锛佸疄娴嬫暟鎹璇濓細
浼樺寲鎵嬫 | 鑰楁椂瀵规瘮锛堜竾娆¤皟鐢級 | 鍐呭瓨娑堣€?/th> |
---|---|---|
鍘熷鍙嶅皠 | 3200ms | 15MB |
缂撳瓨Method瀵硅薄 | 850ms | 鍥哄畾2MB |
鏀圭敤MethodHandle | 650ms | 1.8MB |
鈥?strong>鈥嬩釜浜虹鎴块厤缃€?/strong>鈥嬶細
java澶嶅埗// 鐢–oncurrentHashMap鍋氱紦瀛橈紙绾跨▼瀹夊叏寰堥噸瑕侊紒锛?/span> private static final Map
methodCache = new ConcurrentHashMap<>(); Method cachedMethod = methodCache.computeIfAbsent(methodKey, k -> clazz.getDeclaredMethod(methodName, paramTypes));
馃幆 鎶€宸т簲锛氬疄鎴樹腑鐨勯獨鎿嶄綔锛堝埆鍦ㄧ畝鍘嗕笂鍐欙紒锛?/h3>
"妗嗘灦婧愮爜閲岄偅浜涢粦绉戞妧鏄€庝箞瀹炵幇鐨勶紵" 鏉ュ嚑涓摝杈圭悆鐜╂硶锛?/p>
鈥?strong>鈥嬪満鏅?锛氬姩鎬佷慨鏀筬inal瀛楁鈥?/strong>鈥?/p>
java澶嶅埗Field field = clazz.getDeclaredField("FINAL_VALUE"); field.setAccessible(true); // 鍏堝幓鎺塮inal淇グ绗?/span> Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); field.set(null, newValue); // 鍗遍櫓鎿嶄綔锛佹厧鐢紒
鈥?strong>鈥嬪満鏅?锛氱粫杩囨硾鍨嬫摝闄も€?/strong>鈥?/p>
java澶嶅埗// 鑾峰彇娉涘瀷鏂规硶鐨勭湡瀹炲弬鏁扮被鍨?/span> Method method = clazz.getDeclaredMethod("parseJson", String.class); Type[] genericTypes = method.getGenericParameterTypes();
鈥?strong>鈥嬭娉鍛娾€?/strong>鈥嬶細鍘诲勾鐢ㄨ繖鎷涘姩鎬佷慨鏀筍DK閰嶇疆鍙傛暟锛岀粨鏋滆瀹夊叏鍥㈤槦绾﹁皥鈥斺€斿垏璁帮紒鈥?strong>鈥嬭兘鍔涜秺澶э紝閿呰秺澶р€?/strong>鈥嬶紒
鐙鏁版嵁澶ф斁閫侊紙寤鸿鎴浘淇濆瓨锛?/h3>
鏍规嵁鏈€杩?骞村洟闃熼」鐩粺璁★細
- 鍚堢悊浣跨敤鍙嶅皠鐨勬ā鍧楋紝闇€姹傚彉鏇撮€傞厤閫熷害鎻愬崌60%
- 鍙嶅皠婊ョ敤瀵艰嚧鐨勭嚎涓婁簨鏁呬腑锛屾湁78%鏄洜涓烘病澶勭悊InvocationTargetException
- 浣跨敤缂撳瓨浼樺寲鐨勫弽灏勮皟鐢紝鎬ц兘鎹熻€楀彲鎺у埗鍦?%浠ュ唴
- Android骞冲彴涓婏紝鍙嶅皠璋冪敤鑰楁椂鏄疛ava SE鐜鐨?.3-1.8鍊?/li>
鏈€鍚庤鍙ユ帍蹇冪獫瀛愮殑璇濓細瑙佽繃澶浜烘妸鍙嶅皠鐜╂垚鏉傛妧锛岀粨鏋滈」鐩淮鎶ゆ椂鍝埞鍠婂銆傝浣忊€斺€斺€?strong>鈥嬫鏋舵簮鐮佺湅鐪嬪氨濂斤紝鐢熶骇浠g爜杩樻槸鑰佸疄鍋氫汉鈥?/strong>鈥嬨€傚摢澶╄鏄绁ぉ浜嗭紝鍗冧竾鍒鏄窡鎴戝鐨勶紒锛堢嫍澶翠繚鍛斤級