<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 三、解決方案 ### 3.1 一行代碼寫反射 作為一個Android程序員,索性就拿`TextView`這個類開刀吧。首先定義一個類變量: ~~~ TextView mTv; ~~~ **通過反射得到實例:** ~~~ // 有參數,建立類 mTv = Reflect.on(TextView.class).create(this).get(); // 通過類全名得到類 String word = Reflect.on("java.lang.String").create("Reflect TextView").get(); // 無參數,建立類 Fragment fragment = Reflect.on(Fragment.class).create().get(); ~~~ **通過反射調用方法:** ~~~ // 調用無參數方法 L.d("call getText() : " + Reflect.on(mTv).call("getText").toString()); // 調用有參數方法 Reflect.on(mTv).call("setTextColor", 0xffff0000); ~~~ **通過反射get、set類變量** TextView中有個mText變量,來看看我們怎么接近它。 ~~~ // 設置參數 Reflect.on(mTv).set("mText", "---------- new Reflect TextView ----------"); // 獲得參數 L.d("setgetParam is " + Reflect.on(mTv).get("mText")); ~~~ ### 3.2 什么時候該用反射,什么時候不用反射 又到了這樣權衡利弊的時候了,首先我們明確,在日常開發中盡量不要用反射,除非遇到了必須要通過反射才能調用的方法。比如我在做一個下拉通知中心功能的時候就遇到了這樣的情況。系統沒有提供api,所以我們只能通過反射進行調用,所以我自己寫了這樣一段代碼: ~~~ <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/> ~~~ ~~~ private static void doInStatusBar(Context mContext, String methodName) { try { Object service = mContext.getSystemService("statusbar"); Method expand = service.getClass().getMethod(methodName); expand.invoke(service); } catch (Exception e) { e.printStackTrace(); } } /** * 顯示消息中心 */ public static void openStatusBar(Context mContext) { // 判斷系統版本號 String methodName = (VERSION.SDK_INT <= 16) ? "expand" : "expandNotificationsPanel"; doInStatusBar(mContext, methodName); } /** * 關閉消息中心 */ public static void closeStatusBar(Context mContext) { // 判斷系統版本號 String methodName = (VERSION.SDK_INT <= 16) ? "collapse" : "collapsePanels"; doInStatusBar(mContext, methodName); } ~~~ 先來看看利用jOOR寫的`doInStatusBar`方法會簡潔到什么程度: ~~~ private static void doInStatusBar(Context mContext, String methodName) { Object service = mContext.getSystemService("statusbar"); Reflect.on(service).call(methodName); } ~~~ 哇,就一行代碼啊,很爽吧~ 爽完了,我們就來看看反射問題吧。因為不是系統給出的api,所以谷歌在不同的版本上用了不同的方法名來做處理,用反射的話我們就必須進行版本的判斷,這是需要注意的,此外反射在性能方面確實不好,這里需要謹慎。 我的建議: 如果一個類中有很多地方都是private的,而你的需求都需要依賴這些方法或者變量,那么比起用反射,推薦把這個類復制出來,變成自己的類,像是toolbar這樣的類就可以進行這樣的操作。 在自己寫框架的時候,我們肯定會用到反射,很簡單的例子就是事件總線和注解框架,翔哥就說過一句話:**無反射,無框架**。也正因為是自己寫的框架,所以通過反射調用的方法名和參數一般不會變,更何況做運行時注解框架的話,反射肯定會出現。在這種情況下千萬不要害怕反射,索性放心大膽的做。因為它會讓你完成很多不可能完成的任務。 總結下來就是: 實際進行日常開發的時候盡量少用反射,可以通過復制原始類的形式來避免反射。在寫框架時,不避諱反射,在關鍵時利用反射來助自己一臂之力。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看