馃殌鎶€宸т竴锛氫笁绉嶅Э鍔胯幏鍙朇lass瀵硅薄锛堝埆鍙細鐢?class锛侊級锛堟" />
首页 > 投稿 > 正文内容

Android Java开发必备:Class对象操作类信息的5大实战技巧

投稿2025-05-27 16:19:23

"鎴戞摝锛佸啓涓伐鍏风被杩樿鎵嬪姩缁存姢绫讳俊鎭紵娲昏浣犲ぉ澶╁姞鐝紒" 浠婂ぉ鍜变滑鎼炵偣楂樼骇鎿嶄綔锛屾暀浣犳妸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>
鍘熷鍙嶅皠3200ms15MB
缂撳瓨Method瀵硅薄850ms鍥哄畾2MB
鏀圭敤MethodHandle650ms1.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>

鏍规嵁鏈€杩?骞村洟闃熼」鐩粺璁★細

  1. 鍚堢悊浣跨敤鍙嶅皠鐨勬ā鍧楋紝闇€姹傚彉鏇撮€傞厤閫熷害鎻愬崌60%
  2. 鍙嶅皠婊ョ敤瀵艰嚧鐨勭嚎涓婁簨鏁呬腑锛屾湁78%鏄洜涓烘病澶勭悊InvocationTargetException
  3. 浣跨敤缂撳瓨浼樺寲鐨勫弽灏勮皟鐢紝鎬ц兘鎹熻€楀彲鎺у埗鍦?%浠ュ唴
  4. Android骞冲彴涓婏紝鍙嶅皠璋冪敤鑰楁椂鏄疛ava SE鐜鐨?.3-1.8鍊?/li>

鏈€鍚庤鍙ユ帍蹇冪獫瀛愮殑璇濓細瑙佽繃澶浜烘妸鍙嶅皠鐜╂垚鏉傛妧锛岀粨鏋滈」鐩淮鎶ゆ椂鍝埞鍠婂銆傝浣忊€斺€斺€?strong>鈥嬫鏋舵簮鐮佺湅鐪嬪氨濂斤紝鐢熶骇浠g爜杩樻槸鑰佸疄鍋氫汉鈥?/strong>鈥嬨€傚摢澶╄鏄绁ぉ浜嗭紝鍗冧竾鍒鏄窡鎴戝鐨勶紒锛堢嫍澶翠繚鍛斤級

搜索