反射工具类,如斯优雅,androidui基础教程

这篇具有很好参考价值的文章主要介绍了反射工具类,如斯优雅,androidui基础教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

根据如上注释相信大家也可以理解一二了,如果还想了解更多使用方式,可以查看我写的单元测试类 ReflectUtilsTest,其使用方式就介绍到这里,下面介绍其实现方式。

Achieve

实现的话是站在 jOOR 的肩膀上进行改造,其内部封装了一个 private final Object object; 变量,每次进行反射操作时都会重新实例化一个变量并把结果赋予该变量,最终 get() 就是获取其值,比如我们来看一下 newInstance 的操作,其涉及的代码如下所示:

/**

  • 实例化反射对象
  • @param args 实例化需要的参数
  • @return {@link ReflectUtils}
    */
    public ReflectUtils newInstance(Object… args) {
    Class<?>[] types = getArgsType(args); try { Constructor<?> constructor = type().getDeclaredConstructor(types);
    return newInstance(constructor, args);
    } catch (NoSuchMethodException e) {
    List<Constructor<?>> list = new ArrayList<>(); for (Constructor<?> constructor : type().getDeclaredConstructors()) {
    if (match(constructor.getParameterTypes(), types)) {
    list.add(constructor);
    }
    }
    if (list.isEmpty()) {
    throw new ReflectException(e);
    } else {
    sortConstructors(list);
    return newInstance(list.get(0), args);
    }
    }
    }

private Class<?>[] getArgsType(final Object... args) { if (args == null) return new Class[0]; Class<?>[] result = new Class[args.length];
for (int i = 0; i < args.length; i++) {
Object value = args[i];
result[i] = value == null ? NULL.class : value.getClass();
}
return result;
}

private void sortConstructors(List<Constructor<?>> list) { Collections.sort(list, new Comparator

private ReflectUtils newInstance(final Constructor<?> constructor, final Object… args) {
try {
return new ReflectUtils(
constructor.getDeclaringClass(),
accessible(constructor).newInstance(args)
);
} catch (Exception e) {
throw new ReflectException(e);
}
}

private final Class<?> type;

private final Object object;

private ReflectUtils(final Class<?> type, Object object) {
this.type = type;
this.object = object;
}

jOOR 所没有做到的就是没有对多个符合的 Constructor 进行排序,而是直接返回了第一个与之匹配的。这样说有点抽象,我举个例子应该就明白了,比如说有两个构造函数如下所示:

public class Test {

public Test(Number n) {
}

public Test(Object n) {
}
}

jOOR 反射调用构造函数参数传入 Long 类型,很可能就会走 Test(Object n) 这个构造函数,而我修改过后就是对多个符合的 Constructor 进行排序,匹配出与之最接近的父类,也就是会走 Test(Number n) 这个构造函数,同理,在后面的 method 中的参数匹配 jOOR 也是存在这个问题,我也已经对其修复了。

还有就是 jOOR 对 private static final 字段先 getset 会报异常 java.lang.IllegalAccessException 异常,是因为对 private static final 字段 get 的时候没有去除 final 属性,如果在 get 时就把 final 去掉即可解决,那样在 set 的时候就不会报错。然而,在 Android 的 SDK 中是没有 Field.class.getDeclaredField("modifiers") 这个字段的,所以会报 NoSuchFieldException 异常,这方面我做了容错处理,相关代码如下所示:

/**

  • 设置反射的字段
  • @param name 字段名
  • @return {@link ReflectUtils}
    */
    public ReflectUtils field(final String name) {
    try {
    Field field = getField(name);
    return new ReflectUtils(field.getType(), field.get(object));
    } catch (IllegalAccessException e) {
    throw new ReflectException(e);
    }
    }

/**

  • 设置反射的字段
  • @param name 字段名
  • @param value 字段值
  • @return {@link ReflectUtils}
    */
    public ReflectUtils field(String name, Object value) {
    try {
    Field field = getField(name);
    field.set(object, unwrap(value));
    return this;
    } catch (Exception e) {
    throw new ReflectException(e);
    }
    }

private Field getField(String name) throws IllegalAccessException {
Field field = getAccessibleField(name);
if ((field.getModifiers() & Modifier.FINAL) == Modifier.FINAL) {
try {
Field modifiersField = Field.class.getDeclaredField(“modifiers”);
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
} catch (NoSuchFieldException ignore) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
android 反射框架工具类,2024年程序员学习,windows,log4j
android 反射框架工具类,2024年程序员学习,windows,log4j
android 反射框架工具类,2024年程序员学习,windows,log4j
android 反射框架工具类,2024年程序员学习,windows,log4j
android 反射框架工具类,2024年程序员学习,windows,log4j
android 反射框架工具类,2024年程序员学习,windows,log4j
android 反射框架工具类,2024年程序员学习,windows,log4j

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
android 反射框架工具类,2024年程序员学习,windows,log4j

文末

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

android 反射框架工具类,2024年程序员学习,windows,log4j

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

android 反射框架工具类,2024年程序员学习,windows,log4j

们之前因为秋招收集的二十套一二线互联网公司Android面试真题** (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-E1CBdDGl-1711856540190)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录文章来源地址https://www.toymoban.com/news/detail-856807.html

到了这里,关于反射工具类,如斯优雅,androidui基础教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android SDK(adb命令环境)工具安装下载教程】

    1、打开下载地址:SDK 平台工具版本说明  |  Android Studio  |  Android Developers 2、下载Android SDK Platform-Tools压缩包,选择路径进行解压 3、复制SDK文件platform-tools保存的路径 4、配置adb环境变量;按下win+i,在设置界面搜索”环境变量”-”系统环境变量”进入系统属性界面 5、在系统

    2024年03月18日
    浏览(64)
  • 一个Java反射小工具

     利用JDK提供的反射工具类,可实现简单的Java Bean的属性赋值、获取属性值、获取所有属性及指定属性名的属性等。

    2024年04月25日
    浏览(31)
  • 反射工具-ReflectUtil

    Java的反射机制,可以让语言变得更加灵活,对对象的操作也更加“动态”,因此在某些情况下,反射可以做到事半功倍的效果。Hutool针对Java的反射机制做了工具化封装,封装包括: 获取构造方法 获取字段 获取字段值 获取方法 执行方法(对象方法和静态方法) 为了看到效

    2023年04月10日
    浏览(33)
  • Android安全——客户端安全要点,android开发基础视频教程

    filter.addAction(“MY_ACTION”); localBroadcastManager.registerReceiver(myReceiver, filter); 发送本地广播 Bundle bundle = new Bundle(); bundle.putParcelable(“DATA”, content); Intent intent = new Intent(); intent.setAction(“MY_ACTION”); intent.putExtras(bundle); LocalBroadcastManager.getInstance(context).sendBroadcast(intent); 在Activity销毁时

    2024年04月17日
    浏览(36)
  • Android基础教程——从入门到精通(上)

    本文是对B站教程 动脑学院 Android教程 学习过程中所做的笔记。 文章分为上下两部分,此文是上部分,下部分链接为:Android基础教程——从入门到精通(下) 源视频教程并没有录制全,本文还补充了 Service 和 网络通信 的内容 文章介绍详细,示例代码丰富,相信跟着本教程

    2024年02月02日
    浏览(51)
  • 【常用开发工具】保姆级教程Android Studio安装和基本使用

    🔎这里是【常用开发工具】,关注我学习编程不迷路 如果对你有帮助,给博主一个免费的点赞👍以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 👀专栏介绍 【常用开发工具】 目前更新IDEA、Tomcat、Maven、Git等预计会开10+期,大家一起学习一起进步。 📢📢有写的不好或写错的地

    2023年04月16日
    浏览(64)
  • 脱壳工具:反射大师的使用详解

    一. 反射大师 概述 一个脱壳插件工具,需要在 Xposed 环境中使用,支持市面上大多数加密壳。 反射大师简单容易使用,能脱掉大多数壳,很值得使用 二. 下载Xposed和反射大师 Xposed ,一款可以在不修改 Android APK 的情况下影响程序运行的框架,可用来动态劫持任意 APP ,对于逆

    2023年04月08日
    浏览(39)
  • Android 基于反射实现简易版ButterKnife

    反射比较消耗资源,一般不推荐使用。

    2024年02月10日
    浏览(42)
  • Android反射@hide API 方法、变量,支持Android11和Android12

    Android源码中现在有大量的方法和变量被@hide所修饰,而这些被hide修饰的方法和变量是不允许应用层进行反射获取的,所以富有探索精神的程序员们就开始想尽各种办法绕过系统hide限制来使用@hide修饰的方法和变量。 Android11之前 我们可以使用套娃的形式来欺骗系统,让系统误

    2024年02月11日
    浏览(64)
  • 如何优雅地安装 Android Studio

    💭 写在前面: 我们假设读者已经搞定 JDK 了,如果没搞定请先搜索 JDK 的安装教程。访问 Oracle JDK 下载页面:访问 Java Downloads | Oracle ,点击 \\\"JDK Download\\\" 按钮。选择适合您操作系统的 JDK 版本:根据您的操作系统选择适合的 JDK 版本进行下载。安装 JDK:下载完成后,运行 JD

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包