91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android拼接如何實現動態對象

發布時間:2023-03-01 17:14:09 來源:億速云 閱讀:104 作者:iii 欄目:開發技術

這篇文章主要介紹了Android拼接如何實現動態對象的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Android拼接如何實現動態對象文章都會有所收獲,下面我們一起來看看吧。

1. 前言

我們往往有些配置文件,當項目大的時候,一些配置文件或者一些判斷邏輯就會變得復雜,會出現很多判斷語句,我在想,能不能通過前綴拼接動態參數并且借助反射等方式去消除一些判斷,讓這些判斷的地方去實現動態。

當前只是有個想法,但是這個操作又沒有風險,對性能影響大不大,會不會在使用中出現什么問題,還不得而知,下面就用一些Demo來描述一下這個方案。

這個思路的規則就是:默認前綴拼接動態參數獲取對象,動態參數可以是從后臺獲取,可以是用文件中獲取,可以是從系統參數獲取,等等,任何你能想到的地方,這個根據自己的場景去涉及從何獲取。

2. 動態選密鑰

舉例的場景不一定好,但是應該能看出這個方案的使用方式。

假如我們有做跨端的對稱加密,然后希望密鑰有幾套,不固定只有一套,然后要動態去選擇密鑰,當然這個動態的條件要簡單,不然也只能if-else去寫了。假如我有10套密鑰,我根據當前的時間戳的最后一位,去選擇使用哪套

假設這些公鑰

public class KeyLibs {
    public static final String KEY0 = "0000000000000000";
    public static final String KEY1 = "1111111111111111";
    public static final String KEY2 = "2222222222222222";
    public static final String KEY3 = "3333333333333333";
    public static final String KEY4 = "4444444444444444";
    public static final String KEY5 = "5555555555555555";
    public static final String KEY6 = "6666666666666666";
    public static final String KEY7 = "7777777777777777";
    public static final String KEY8 = "8888888888888888";
    public static final String KEY9 = "9999999999999999";
}

如果我要用if-else去寫

String key;
int type = (int) ((System.currentTimeMillis()/1000) % 10);
if (type == 0){
    key =  KeyLibs.KEY0;
}else if (){......}
......
else if (type == 9){
    key =  KeyLibs.KEY9;
}

這樣寫就很讓人不舒服,但是如果我們用反射

try {
    long time = System.currentTimeMillis()/1000;
    Log.v("mmp", "獲取到的時間:" + time);
    Class cls = Class.forName("com.kylin.demo.KeyLibs");
    Field fields = cls.getDeclaredField("KEY" + (time % 10));
    fields.setAccessible(true);
    String result = (String) fields.get(null);
    Log.v("mmp", "獲取到的key:" + result);
} catch (Exception e) {
    e.printStackTrace();
}

可以看看結果

Android拼接如何實現動態對象

這里的"KEY" + (time % 10)就是拼接操作

這樣據這個例子好像又感覺不要太好,在這個基礎上我們變一變。假如我們有很多套域名,根據一個參數的值去判斷去用什么域名。

根據一個參數的值去判斷去用什么域名,這個參數可以是后臺返回一個string字符串,可以是寫在文件中(比如利用v1簽名的漏洞的參數),也可以是其它方式。總之需要只根據這個參數的值去判斷使用哪個域名 ,那我們可以這樣做

先寫下域名常量

public class KeyLibs {
    public static final String URL_SHUAI = "www.shuai.com";
    public static final String URL_ZHENDESHUAI = "www.zhendeshuai.com";
    public static final String URL_SHIFENSHUAI = "www.shifenshuai.com";
    public static final String URL_QUESHISHUAI = "www.queshishuai.com";
}

然后通過反射去獲取

try {
    String type = .......
    Class cls = Class.forName("com.kylin.demo.KeyLibs");
    // toUpperCase 是轉大寫
    Field fields = cls.getDeclaredField("URL_" + toUpperCase(type));
    fields.setAccessible(true);
    String result = (String) fields.get(null);
} catch (Exception e) {
    e.printStackTrace();
}

假如你的type拿到的是shifenshuai,那這里拿到的域名就是URL_SHIFENSHUAI。那有個朋友就說了,為什么不動態返回這個域名呢,我這不是舉例嘛,沒想到什么比較好的例子,大概能看懂這個意思就行。

這里的"URL_" + toUpperCase(type)就是拼接操作

3. 換膚上的使用

假如我要使用換膚,我可以這樣定規則:我的皮膚資源ID的名稱是原資源的名稱加上下劃線加上皮膚名

比如我的這一套皮膚的皮膚名是"plugin",我的原皮膚中有個圖片kylin_close,那我的這個圖片在這套皮膚中的名字就叫kylin_close_plugin

Android拼接如何實現動態對象

PS:我這里只是舉個例子,一般皮膚資源不會直接這樣和原資源放在一起,要么動態皮膚放在插件中,要么靜態皮膚放在單獨一個文件用gradle去控制資源合并

那我要做的就是當我從任何地方接收到這個皮膚名之后,我把原皮膚換成新的皮膚。Resources的getIdentifier能根據名稱找到皮膚,但我不想通過名稱,我想通過資源,這樣也方便我查看資源,那我可以這樣寫 (代碼直接在這寫,沒經過驗證,如果拿去用有問題,可自行調整)

public int getPluginId(int id){
    String name = "plugin"; // todo 動態獲取的參數
    String rName = getResources().getResourceName(id);
    rName = rName + "_" + name;
    // todo 這里我寫死是drawable,顯示可以根據TypeId去判斷是什么
    int result = getResources().getIdentifier(rName, "drawable", getPackageName());;
    if (result == -1){
        result = id; //找不到資源的情況下用會原資源
    }
    return result;
}

在調用的地方

imageView.setImageResource(getPluginId(R.drawable.kylin_close));

這里的rName = rName + "_" + name就是拼接操作。

先解讀一下這段代碼,因為也算是不完整的代碼。name就是我們獲取的動態參數,上面也說了,這個參數是可以從后臺反,可以從本地文件拿,可以從你自己設計的任何一個地方拿到。然后getResources().getResourceName就是根據傳進來的資源ID拿到資源名稱,然后rName = rName + "_" + name拼接操作,就是得到我們皮膚的資源名稱,再用getIdentifier方法通過資源名稱拿到資源ID,最后判斷如果拿不到資源ID的話,就返回原資源ID。 然后這里有個地方我沒寫,就是你可以通過資源ID去判斷資源的類型(我這里寫死drawable),其實這個可以根據id去判斷,我們都知道ID的組成是有規則的,分為PackageId、TypeId、EntryId這些,我們可以進行拆解判斷TypeId就知道是什么資源了,這里我就不演示了,相信大家能理解。

好,那這么做的好處是什么,這么做其實有個好處就是如果你的某個資源要新皮膚,你直接給新皮膚的資源按約定格式去命名就行,這樣就不用去改代碼。

關于“Android拼接如何實現動態對象”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Android拼接如何實現動態對象”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中方县| 阳江市| 罗平县| 高邑县| 镇赉县| 武穴市| 武乡县| 忻城县| 嘉兴市| 大竹县| 阜新市| 樟树市| 江油市| 河曲县| 凌云县| 潞城市| 泗洪县| 陆丰市| 班戈县| 班玛县| 孟村| 奎屯市| 亳州市| 巨野县| 临夏市| 平凉市| 利川市| 萍乡市| 安图县| 五家渠市| 曲靖市| 六安市| 甘孜| 中江县| 吕梁市| 东方市| 忻州市| 化州市| 密山市| 大埔县| 台北市|