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源代码:
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