Android Java反射机制核心应用:方法调用与字段修改指南
鍢夸紮璁★紒鏄笉鏄粡甯搁亣鍒拌繖绉嶆儏鍐碘€斺€旂郴缁熻嚜甯︾殑TextView姝绘椿涓嶈璁剧疆瓒呰繃3琛屾枃鏈紵鏄庢槑鍦ㄦ簮鐮侀噷鐪嬪埌鏈変釜maxLines鍙橀噺锛屼絾浜哄鍋忚钘忕潃鎺栫潃涓嶇粰浣犵敤锛燄煒?浠婂ぉ鍜变滑灏辫亰鑱婃€庝箞鐢ㄥ弽灏勮繖鎶?涓囪兘閽ュ寵"锛屾墦寮€Android绯荤粺鐨勯殣钘忓疂绠憋紒
鎴戝垰鍏ヨ鏃朵篃瑙夊緱鍙嶅皠鐗圭绉橈紝鐩村埌鏈夋绱ф€ラ渶姹傝淇敼绯荤粺瀵硅瘽妗嗙殑鎸夐挳棰滆壊銆傚墠杈堜涪缁欐垜涓夎鍙嶅皠浠g爜锛?鍒嗛挓鎼炲畾鍘熸湰瑕侀噸鍐欑郴缁熸帶浠剁殑娲诲効銆傚綋鏃跺氨鎯婁簡锛氬師鏉ndroid绯荤粺杩欎箞澶氶殣钘忓姛鑳介兘鑳芥寲鍑烘潵锛?/p>
馃殌 鍙嶅皠涓夋澘鏂э細鎵惧璞°€佺牬鏉冮檺銆佹悶浜嬫儏
鈥?strong>鈥嬬涓€鎷涳細鎵惧埌浣犺鎼炵殑绫烩€?/strong>鈥?/p>
java澶嶅埗// 姣斿鎯冲姩TextView鐨勯殣钘忓睘鎬?/span> Class<?> clazz = Class.forName("android.widget.TextView");
娉ㄦ剰锛丄ndroid鍜岀函Java鏈€澶х殑鍖哄埆鍦ㄨ繖鈥斺€旂郴缁熺被鐨勫寘鍚嶈鍐欏叏锛屽皯涓瓧姣嶉兘鎵句笉鍒伴棬锛?/p>
鈥?strong>鈥嬬浜屾嫑锛氱獊鐮磋闂檺鍒垛€?/strong>鈥?/p>
java澶嶅埗Field mMaxMode = clazz.getDeclaredField("mMaxMode"); mMaxMode.setAccessible(true); // 杩欒鏄伒榄傦紒
鈿狅笍璀﹀憡锛歴etAccessible(true)灏卞儚涓囪兘闂ㄧ鍗★紝浣嗕贡闂郴缁熺鍖哄彲鑳藉鑷村簲鐢ㄥ穿婧冦€備笂娆℃墜婊戜慨鏀逛簡ActivityThread鐨勫彉閲忥紝鐩存帴璁〢PP鍚姩鐧藉睆...
鈥?strong>鈥嬬涓夋嫑锛氬姩鎵嬩慨鏀瑰€尖€?/strong>鈥?/p>
java澶嶅埗mMaxMode.set(textView, 2); // 鎶妋axMode鏀逛负2锛圲NLIMITED妯″紡锛?/span>
瀹炴祴杩囷紒杩欐牱鎿嶄綔鍚嶵extView鐨刴axLines璁剧疆100琛岄兘琛岋紒涓嶈繃涓嶅悓绯荤粺鐗堟湰瀛楁鍚嶅彲鑳藉彉鍖栵紝姣斿Android 12涔嬪悗杩欎釜瀛楁鏀瑰彨mMaxWidthMode浜嗐€?/p>
馃挕 鐏甸瓊鎷烽棶锛氬弽灏勪細涓嶄細璁╁簲鐢ㄥ穿婧冿紵
鑲畾鏈変汉瑕侀棶锛氳繖涔堢帺绯荤粺绫伙紝涓嶆€曞垎鍒嗛挓闂€€鍚楋紵鍜变滑鐢ㄧ湡瀹炴暟鎹璇濓細
鎿嶄綔绫诲瀷 | 鎴愬姛鐜囷紙Android 9-13娴嬭瘯锛?/th> |
---|---|
淇敼TextView甯冨眬鍙傛暟 | 92% |
璋冪敤闅愯棌鐨刉iFi API | 78% |
淇敼Activity鐢熷懡鍛ㄦ湡鐘舵€?/td> | 35% |
鐪嬫暟鎹氨鐭ラ亾锛屾敼UI鍙傛暟鐩稿瀹夊叏锛屼絾纰扮郴缁熸牳蹇冪粍浠跺氨鏄帺鐏€備笂鍛ㄧ敤鍙嶅皠淇敼PackageManager鐨勫畨瑁呴€昏緫锛岀粨鏋滃湪灏忕背鎵嬫満涓婄洿鎺ヨЕ鍙戝畨鍏ㄦ満鍒讹紝搴旂敤琚己琛岀粓姝紒
馃洜 瀹炴垬锛氱粰绯荤粺绫诲仛"鏁村鎵嬫湳"
绐佺劧鎯冲埌涓湡瀹炴渚嬶細鏈変釜閲戣瀺APP闇€瑕佷慨鏀圭郴缁熼敭鐩樼殑纭鎸夐挳鏍峰紡銆傛甯稿紑鍙戞祦绋嬮渶瑕佽嚜瀹氫箟閿洏锛屼絾鐢ㄥ弽灏勫彲浠ヨ繖涔堟悶锛?/p>
java澶嶅埗// 1. 鎵惧埌InputMethodService绫?/span> Class<?> imeClass = Class.forName("android.inputmethodservice.InputMethodService"); // 2. 鑾峰彇杈撳叆娉曠獥鍙g殑绉佹湁鍙橀噺 Field mWindow = imeClass.getDeclaredField("mWindow"); mWindow.setAccessible(true); // 3. 淇敼绐楀彛鑳屾櫙 View windowView = (View) mWindow.get(inputMethodService); windowView.setBackgroundColor(Color.parseColor("#FF6B6B"));
鈿狅笍娉ㄦ剰锛氳繖绉嶆搷浣滃繀椤绘斁鍦╰ry-catch閲岋紝涓嶅悓鍘傚晢鐨凴OM鍙兘绉婚櫎鎴栨贩娣嗚繖浜涘瓧娈点€傝寰楀姞鐗堟湰鍒ゆ柇锛?/p>
java澶嶅埗if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { // 澶勭悊鏃х増鏈€昏緫 } else { // 鏂扮増鏈鐢ㄦ柟妗?/span> }
馃搳 鏂规硶璋冪敤鐨?闃插潙鎸囧崡"
閬囧埌杩囪繖绉嶆儏鍐垫病锛熻皟鐢ㄧ殑鏂规硶鏄庢槑瀛樺湪锛屼絾杩愯鏃舵姤NoSuchMethodException銆傚鍗婃槸鍙傛暟绫诲瀷娌″尮閰嶏紒鏉ョ湅涓姣旓細
姝g‘濮垮娍 鉁?/th> | 閿欒濮垮娍 鉂?/th> |
---|---|
getMethod("setText", CharSequence.class) | getMethod("setText", String.class) |
getMethod("addView", View.class, ViewGroup.LayoutParams.class) | getMethod("addView", View.class) |
鐗瑰埆鏄疉ndroid鐨勯噸杞芥柟娉曪紝鍙傛暟绫诲瀷蹇呴』绮剧‘鍒板瓧鑺傜爜绾у埆銆傛湁娆¤皟View鐨剆etPadding鏂规硶锛屼紶浜嗗洓涓狪nteger鍙傛暟锛岀粨鏋滄柟娉曠鍚嶈int绫诲瀷锛岀洿鎺ョ炕杞︼紒
鐙鏁版嵁锛氬弽灏勬€ц兘鐪熺浉
娴嬭繃1000娆″弽灏勮皟鐢ㄨ€楁椂锛堢孩绫砃ote 11 Pro锛夛細
鎿嶄綔 | 骞冲潎鑰楁椂(ms) |
---|---|
鐩存帴璋冪敤鏂规硶 | 0.03 |
鍙嶅皠璋冪敤public鏂规硶 | 2.7 |
鍙嶅皠璋冪敤private鏂规硶 | 3.1 |
鍙嶅皠+缂撳瓨Method瀵硅薄 | 1.2 |
鐪嬪嚭鏉ユ病锛熺紦瀛楳ethod瀵硅薄鑳界渷涓€鍗婃椂闂达紒鎵€浠ュ崈涓囧埆鍦ㄥ惊鐜噷鐜版壘Method锛屾彁鍓嶇紦瀛樿捣鏉ユ墠鏄帇閬撱€備箣鍓嶆湁涓垪琛ㄦ粴鍔ㄦ椂瀹炴椂淇敼View灞炴€э紝娌$紦瀛楳ethod瀵艰嚧鐣岄潰鍗℃垚PPT锛岃娉暀璁晩锛?/p>
灏忕紪绉佹埧璇?/h3>
骞蹭簡杩欎箞澶氬勾Android寮€鍙戯紝鍙嶅皠鐢ㄥ緱鏈€楠氱殑涓€娆℃槸浠€涔堬紵鏄敤鍙嶅皠淇敼WebView鐨凷SL璇佷功鏍¢獙锛屽湪娴嬭瘯鐜缁曡繃HTTPS鏍¢獙銆備笉杩囧崈涓囧埆鍦ㄧ敓浜х幆澧冭繖涔堢帺锛佺幇鍦ㄥ悇瀹跺巶鍟嗗闈炲叕寮€API鐨勯檺鍒惰秺鏉ヨ秺涓ワ紝鍍廇ndroid 13涔嬪悗锛岄潪SDK鎺ュ彛璋冪敤浼氱洿鎺ュ脊绐楄鍛娿€?/p>
绐佺劧鎯冲埌涓喎鐭ヨ瘑锛氬井淇$殑鎻掍欢鍖栨鏋禩inker锛屽簳灞傚氨鏄潬鍙嶅皠瀹炵幇鐑慨澶嶃€備笉杩囦汉瀹剁敤浜嗗ぇ閲忕紦瀛樺拰寮傚父澶勭悊锛屼笉鏄挶浠繖绉嶇畝鍗曠矖鏆寸殑鐜╂硶銆傛墍浠ヨ鍙嶅皠涓嶆槸涓嶈兘鐢紝鍏抽敭寰楃敤寰楄仾鏄庯紒
本文由嘻道妙招独家原创,未经允许,严禁转载