Kotlin反射訪問androidx.collection.LruCache類私有變量
androidx.collection.LruCache類中定義了一個名為map的LinkedHashMap,map存儲了所有LruCache的數據,有時候需要遍歷訪問該LinkedHashMap,取出里面的值,但是LruCache代碼實現中,map為private私有,且無get方法返回,所以需要通過反射訪問。
?
比如:
import java.lang.reflect.Fieldfun 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
?