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


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

通过多层嵌套才成功获得我们想要的变量的值,但是这才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)
    }

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

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

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

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

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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值