Kotlin反射访问androidx.collection.LruCache类私有变量

Kotlin反射访问androidx.collection.LruCache类私有变量

androidx.collection.LruCache类中定义了一个名为map的LinkedHashMap,map存储了所有LruCache的数据,有时候需要遍历访问该LinkedHashMap,取出里面的值,但是LruCache代码实现中,map为private私有,且无get方法返回,所以需要通过反射访问。

比如:

Kotlin 复制代码
import java.lang.reflect.Field

fun main() {
    val myLruCache = make()
    val lruCache = myLruCache as LruCache<Any, Any>
    lruCache::class.members.forEach {
        //println("${it.name}")
    }

    //寻找LruCache类中名为 map 的private私有变量。
    var privateField: Field = LruCache::class.java.getDeclaredField("map")
    //改变private属性,变成可访问。
    privateField.setAccessible(true)

    var obj: Any? = privateField.get(lruCache)
    var map = obj as HashMap<Any, Any>
    println(map)
}

fun make(): MyLruCache {
    var cache = MyLruCache(100)
    cache.put("year", 2023)
    cache.put(1, "fly")
    return cache
}

class MyLruCache(size: Int) : LruCache<Any, Any>(size) {

}

{year=2023, 1=fly}

Android官方的androidx.collection.LruCache源代码:

https://android.googlesource.com/platform/frameworks/support/+/f2e05c341382db64d127118a13451dcaa554b702/collection/collection/src/main/java/androidx/collection/LruCache.javahttps://android.googlesource.com/platform/frameworks/support/+/f2e05c341382db64d127118a13451dcaa554b702/collection/collection/src/main/java/androidx/collection/LruCache.java

Java反射类Class,反射方法Method以及反射变量Field_zhangphil的博客-CSDN博客Java反射类Class,反射方法Method以及反射变量Fieldimport com.orhanobut.logger.Logger;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;public class JavaActivity extends A...https://blog.csdn.net/zhangphil/article/details/80185335Java反射类private私有变量Map并赋值_zhangphil的博客-CSDN博客Java反射改变Android属性在某些情况下,Android体系里面的某些对象没有对外提供针对某个属性或者类,方法公开的get或者set方法,但是项目需要对这些需要修改和调整。就需要使用Java的反射机制修改Android的属性。Java反射类Class,反射方法Method以及反射变量Fieldimport com.orhanobut.logger.Logger;Java反射类Class,反射方法Method以及反射变量Field_zhangphil的博客-CSDN博客。https://blog.csdn.net/zhangphil/article/details/131935002

Java反射改变Android属性_zhangphil的博客-CSDN博客Java反射改变Android属性在某些情况下,Android体系里面的某些对象没有对外提供针对某个属性或者类,方法公开的get或者set方法,但是项目需要对这些需要修改和调整。就需要使用Java的反射机制修改Android的属性。举一个简单的例子,通过Java反射机制改变Android ListView分割线的高度值。Android的ListView本身有分割线,并对外提供了公开设置分割线高度的https://blog.csdn.net/zhangphil/article/details/80138465

相关推荐
Bigger1 小时前
Flutter 开发实战:解决华为 HarmonyOS 任务列表不显示 App 名称的终极指南
android·flutter·华为
利剑 -~4 小时前
mysql面试题整理
android·数据库·mysql
梁同学与Android6 小时前
Android ---【经验篇】ArrayList vs CopyOnWriteArrayList 核心区别,怎么选择?
android·java·开发语言
沐怡旸7 小时前
【翻译】adb screenrecord 帮助文档
android
lienyin8 小时前
Android 简单的SFTP服务端+客户端通信传文件
android
6666v68 小时前
Android Kotlin(2) 协程上下文与异常处理机制
kotlin
zhangphil12 小时前
Kotlin协程await与join挂起函数异同
kotlin
fatiaozhang952714 小时前
中兴B860AV5.2-U_原机安卓4.4.2系统专用_晶晨S905L3SB处理器_线刷固件包
android·电视盒子·刷机固件·机顶盒刷机·中兴b860av5.2-u
儿歌八万首14 小时前
Android 自定义 View 实战:打造一个跟随滑动的丝滑指示器
android·kotlin
我有与与症14 小时前
Kuikly 实战:手把手撸一个跨平台 AI 聊天助手 (ChatDemo)
android