码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java Kotlin 循环反射 一行代码完美实现多层反射


    Java/Kotlin 循环反射 一行代码完美实现多层反射

        • 背景
        • 传统编写方式
        • 循环反射
        • 经过测试发现:反射对象直接获取class只能拿到子类,如果该参数在父类私有,则需要强转成父类进行操作

    PS:这里编写是用的Kotlin,相信只会Java也能看懂

    背景

    众所周知Java里的反射是一件非常枯燥繁琐的事情,特别是遇到a.a.c.v.b.a这类的,如果要完全写出Java代码就会非常的麻烦,而且反射写得多会把自己绕进去,导致出现问题

    传统编写方式

    假设原始的代码的反射如下

      val fieldB = XXXX::class.java.getDeclaredField("b")
      fieldB.isAccessible = true
      val b = fieldB.get(XXX) ?: return@delay
      val fieldBA =com.xxx.b.d::class.java.getDeclaredField("C")
      fieldBA.isAccessible = true
      //((com.XXX.a.a) b.a)
      val a = fieldBA.get(b) ?: return@delay
      a as com.XXX.a.a
      val fieldBAA = com.XXX.a.a::class.java.getDeclaredField("a")
      fieldBAA.isAccessible = true
      val title = fieldBAA.get(a) ?: return@delay
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    通过多层嵌套才成功获得我们想要的变量的值,但是这才3层就已经很多代码了,而且反射的时候是不需要强转的。

    循环反射

    我们发现上面很多的重复代码所以可以使用for循环代替,具体实现代码如下

     fun fieldQueue(fieldObj: Any, result: (obj: Any) -> Unit, vararg rule: String) {
            val count = rule.size
            var tempFieldClz: Class<*> = fieldObj.javaClass
            var tempFieldObj: Any = fieldObj
            for (index in 0 until count) {
                val tempField = tempFieldClz.getDeclaredField(rule[index])
                tempField.isAccessible = true
                tempFieldObj = tempField.get(tempFieldObj) ?: return
                tempFieldClz = tempFieldObj.javaClass
            }
            result(tempFieldObj)
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    其中的 result: (obj: Any) -> Unit其实就是一个回调,在Kotlin里面的语法糖就是如此
    vararg对应的就是Java里面的...(可变参数) class<*>就是class
    通过上述代码,我们可以用以下代码来实现

      fieldQueue(XXXX, {it->
                    LogUtils.e("XXXe", it)
                }, "b", "C", "a")
    
    • 1
    • 2
    • 3

    实验证明,只需要很精简的代码就可以实现复杂的嵌套反射

    经过测试发现:反射对象直接获取class只能拿到子类,如果该参数在父类私有,则需要强转成父类进行操作

    前提是:规则一定要对,一个string就对应一个Field!
    如果帮到您,欢迎点个赞哦

  • 相关阅读:
    QTableWidget 合并单元格
    laravel 阿里云短信发送
    学习总结1
    【无标题】
    [SpringBoot]SpringBoot概述(简介、官网构建、快速启动)
    微服务网关 —— SpringCloud Gateway
    OpenHarmony 3.1 Beta版本关键特性解析——OpenHarmony图形框架
    Springboot视图解析与模板引擎~
    springboot集成hystrix和feign,解决fallback,fallbackFactory不生效问题
    08数组-滑动窗口、HashMap
  • 原文地址:https://blog.csdn.net/weixin_43328457/article/details/126506277
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号