我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android拼接如何实现动态对象

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android拼接如何实现动态对象

这篇文章主要介绍了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拼接如何实现动态对象”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android拼接如何实现动态对象

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android拼接如何实现动态对象

这篇文章主要介绍了Android拼接如何实现动态对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android拼接如何实现动态对象文章都会有所收获,下面我们一起来看看吧。1. 前言我们往往有些配置文件,当项目
2023-07-05

Android拼接实现动态对象方法详解

这篇文章主要为大家介绍了Android拼接实现动态对象方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-01

MySQL动态SQL拼接怎么实现

这篇“MySQL动态SQL拼接怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL动态SQL拼接怎么实现”文章吧
2022-12-16

java动态拼接sql如何执行

Java动态拼接SQL执行动态拼接SQL允许在运行时添加用户输入到SQL语句中。在Java中,这可以通过字符串拼接或SQL参数化查询实现。字符串拼接简单但有SQL注入风险,而参数化查询通过使用占位符来消除此风险。本指南提供了使用两种方法拼接动态SQL的步骤,并探讨了优点、缺点、示例和考虑因素。
java动态拼接sql如何执行
2024-04-12

angularjs循环对象属性如何实现动态列

小编给大家分享一下angularjs循环对象属性如何实现动态列,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!angularjs循环对象属性实现动态列优点:保存对象
2023-06-25

MybatisPlus实现多条件拼接动态查询

1、前 言 最近在开发过程中,需要用 MybatisPlus 实现类似以下形式的 SQL 语句,动态拼接多个条件,进行查询。 select *from user_infowhere is_deleted = 0and is_tag = 1a
2023-08-20

php如何实现静态拼接网页效果

这篇文章主要讲解了“php如何实现静态拼接网页效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何实现静态拼接网页效果”吧!方法一:使用 ob_start() 和 ob_get_co
2023-07-05

Go反射实现动态修改对象

反射是 go 语言中一项强大的特性,它允许我们在运行时检查和修改对象。借助反射,我们可以:迭代对象的字段并动态修改字段值。根据动态输入创建结构体,即使我们不知道输入的键名。在不修改源代码的情况下实现定制解析器和序列化器。用 Go 反射动态修
Go反射实现动态修改对象
2024-04-08

Java面向对象之如何实现多态

这篇文章主要介绍了Java面向对象之如何实现多态,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。转载于 : http://www.verejava.com/?id=169928
2023-06-02

mybatis动态拼接怎么实现有条件的插入

本文小编为大家详细介绍“mybatis动态拼接怎么实现有条件的插入”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis动态拼接怎么实现有条件的插入”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。动态拼接实
2023-06-29

Android动态权限申请如何实现

本篇内容介绍了“Android动态权限申请如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Google 在 Android 6.0 开
2023-07-05

MySQL中如何实现SQL拼接

在MySQL中,可以使用CONCAT()函数来实现SQL拼接。CONCAT()函数可以将多个字符串拼接在一起,例如:SELECT CONCAT('Hello', ' ', 'World&#
MySQL中如何实现SQL拼接
2024-04-29

Node.js中如何实现SQL拼接

在Node.js中实现SQL拼接一般可以使用第三方库来辅助,比如mysql或sequelize。以下是使用mysql库实现SQL拼接的示例代码:const mysql = require('mysql');// 创建数
Node.js中如何实现SQL拼接
2024-04-29

java对象动态增加属性怎么实现

在Java中,对象的属性通常是在编译时确定的,无法在运行时动态地增加属性。然而,可以通过使用Java的反射机制来实现动态增加属性的效果。首先,可以创建一个类或者使用已有的类作为基础,该类可以有一些固定的属性。然后,使用Java反射机制中的`
2023-10-12

Java如何实现Android拼图游戏

这篇文章主要介绍“Java如何实现Android拼图游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java如何实现Android拼图游戏”文章能帮助大家解决问题。1.项目介绍这是一款基于 Jav
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录