码农知识堂 - 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!
    如果帮到您,欢迎点个赞哦

  • 相关阅读:
    数组模拟实现环形队列
    算法刷题:动态规划-背包问题学习整理
    网络安全管理员高级工理论题库(持续更新中)
    R语言绘制圆形树状图
    在代码评审中用好这7招,很容易就能建立起你的反对同盟
    Linux —— linuxdeployqt源码编译与打包
    【Python】Python运算符/部分函数对应的双下划线魔法方法
    巨控GRM230模块在分散式污水行业专用解决方案
    2022年Android面试之Jetpack(AAC框架)篇
    树结构数据在table中回显 treeselect disabled
  • 原文地址:https://blog.csdn.net/weixin_43328457/article/details/126506277
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号