iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android拼接实现动态对象方法详解
  • 497
分享到

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

Android拼接动态对象Android 动态对象 2023-03-01 11:03:31 497人浏览 薄情痞子
摘要

目录1. 前言2. 动态选密钥3. 换肤上的使用4. 总结1. 前言 我们往往有些配置文件,当项目大的时候,一些配置文件或者一些判断逻辑就会变得复杂,会出现很多判断语句,我在想,能

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();
}

可以看看结果

这里的"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

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就知道是什么资源了,这里我就不演示了,相信大家能理解。

好,那这么做的好处是什么,这么做其实有个好处就是如果你的某个资源要新皮肤,你直接给新皮肤的资源按约定格式去命名就行,这样就不用去改代码。

4. 总结

我这里其实感觉例子列举得不是很好,但是主要是想表达,通过自己去约定一套规则,通过前缀拼接动态参数的方式去消除一些非必要的判断语句,并且在一定程度上能提高扩展性。但相对的也有缺点,比如换肤那个例子,我先通过ID拿到名称,再通过名称拿到目标ID,就其实多走了两步,但是这个对性能的影响有多少,这就需要具体去取舍了。因为我是一想到就写出来,所以可能有些地方没考虑周全。

以上就是Android拼接实现动态对象方法详解的详细内容,更多关于Android拼接动态对象的资料请关注编程网其它相关文章!

--结束END--

本文标题: Android拼接实现动态对象方法详解

本文链接: https://www.lsjlt.com/news/197938.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Android拼接实现动态对象方法详解
    目录1. 前言2. 动态选密钥3. 换肤上的使用4. 总结1. 前言 我们往往有些配置文件,当项目大的时候,一些配置文件或者一些判断逻辑就会变得复杂,会出现很多判断语句,我在想,能...
    99+
    2023-03-01
    Android拼接动态对象 Android 动态对象
  • Android拼接如何实现动态对象
    这篇文章主要介绍了Android拼接如何实现动态对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android拼接如何实现动态对象文章都会有所收获,下面我们一起来看看吧。1. 前言我们往往有些配置文件,当项目...
    99+
    2023-07-05
  • MySQL动态SQL拼接实例详解
    目录目标分析讲解1. 准备MyBATis环境2. <if>标签:3. <where>标签4. <foreach>标签 语法介绍5. <sql>标签总结目...
    99+
    2022-12-15
    mysql 动态拼接 mysql sql拼接 sql语句动态拼接
  • 详解Spring中实现接口动态的解决方法
    前言本文主要给大家介绍的是关于Spring实现接口动态的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧。关于这个问题是因为领导最近跟我提了一个需求,是有关于实现类Mybatis的@Select、@Insert注解的功...
    99+
    2023-05-31
    spring 动态接口
  • MySQL动态SQL拼接怎么实现
    这篇“MySQL动态SQL拼接怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyS...
    99+
    2022-12-16
    mysql sql
  • Pandas实现数据拼接的操作方法详解
    目录merge 操作merge 拼接方式merge 举例join 操作join 举例concat 操作concat 举例append 举例数据科学领域日常使用 Python 处理大规...
    99+
    2024-04-02
  • Python详解如何动态给对象增加属性和方法
    Python对象动态的增加属性和方法 前面我们了解到数据封装、继承和多态只是面向对象程序设计中最基础的3个概念。 在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功...
    99+
    2024-04-02
  • MybatisPlus实现多条件拼接动态查询
    1、前 言 最近在开发过程中,需要用 MybatisPlus 实现类似以下形式的 SQL 语句,动态拼接多个条件,进行查询。 select *from user_infowhere is_deleted = 0...
    99+
    2023-08-20
    mysql mybatis-plus spring boot
  • angularjs循环对象属性实现动态列的思路详解
    angularjs循环对象属性实现动态列 优点:保存对象,在数据库只保存一条数据 缺点:添加对象属性需要修改表结构、代码,然后重新重新发布 实现思路 1)数据库创建表(对象)、创建字...
    99+
    2024-04-02
  • JavaScript实现动态表格的方法详解
    目录JavaScript实现动态表格基本效果如下代码如下:第一种方式(较简单,建议使用)方式二改进版代码如下:总结JavaScript实现动态表格 (改建版,代码见最下面) 基本效...
    99+
    2024-04-02
  • SpringSecurity动态权限的实现方法详解
    目录1. 动态管理权限规则1.1 数据库设计1.2 实战2. 测试最近在做 TienChin 项目,用的是 RuoYi-Vue 脚手架,在这个脚手架中,访问某个接口需要什么权限,这个...
    99+
    2024-04-02
  • R语言绘图公式与变量对象混合拼接实现方法
    当我们在R中进行绘图时,如果涉及到数学或统计公式的展现,可以使用函数:expression(),并且与 paste() 结合可以非常轻松的展现出自己想要展示的公式。详细的相关内容可参...
    99+
    2024-04-02
  • PHP对象转字符的实现方法详解
    PHP是一种广泛应用于服务器端开发的编程语言,它具有强大的面向对象特性。在PHP中,对象是一种数据结构,通常用于存储数据和方法以便在程序中重复使用。但有时候需要将对象转换为字符串,例如...
    99+
    2024-03-06
    php对象转字符 对象转字符串方法 php对象序列化
  • MyBatis中动态SQL拼接的方法是什么
    MyBatis中动态SQL拼接的方法主要是使用if、choose、when、otherwise等标签来实现动态条件拼接。具体来说,可...
    99+
    2024-04-08
    MyBatis
  • 详解C++ OpenCV实现图像拼接的原理及方法
    目录前言一、图像拼接相关原理 图像特征采集特征提取算法透视变换透视矩阵图像拷贝二、案例实现Step1:导入目标图片Step2:特征点提取和匹配 Step3:图像配...
    99+
    2024-04-02
  • Android 动态加载 so实现示例详解
    目录背景so动态加载介绍从一个例子出发so库检索与删除动态加载so结束了吗?ELF文件扩展总结背景 对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可...
    99+
    2024-04-02
  • mybatis动态拼接实现有条件的插入
    目录动态拼接实现有条件的插入最近在做项目的时候遇到了一个很现实的问题mybatis插入语句mybatis插入语句一般都是这样写 动态拼接实现有条件的插入 最近在做项目的时候...
    99+
    2024-04-02
  • java中抽象类、抽象方法、接口与实现接口实例详解
    前言对于java中的抽象类,抽象方法,接口,实现接口等具体的概念就不在这里详细的说明了,网上书本都有很多解释,主要是我懒,下面通过一个例子来说明其中的精髓要点,能不能练成绝世武功,踏上封王之路,就看自己的的啦(不要误会,我指的只是我自己啦啦...
    99+
    2023-05-30
    java 抽象类 接口
  • Android滑动拼图验证码控件使用方法详解
    简介: 很多软件为了安全防止恶意攻击,会在登录/注册时进行人机验证,常见的人机验证方式有:谷歌点击复选框进行验证,输入验证码验证,短信验证码,语音验证,文字按顺序选择在图片上点击,滑...
    99+
    2024-04-02
  • 利用OpenCV实现YOLO对象检测方法详解
    目录前言什么是YOLO物体检测器?项目结构检测图像检测视频前言 本文将教你如何使用YOLOV3对象检测器、OpenCV和Python实现对图像和视频流的检测。用到的文件有yolov3...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作