首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android Integer 緩存池被反射篡改:SMALL_VALUES 值異常變更

     編輯:程式設計疑難解答

離奇現象

調用硬盤錄像機登錄 SDK 後,Integer.valueOf(0) 返回 9 或 3,正常應為 0。截圖:

現象1

現象2

原因分析

Java Integer 內部緩存 -128 ~ 127 的實例(IntegerCache.cache)。某些 Native SDK 或反射代碼可能修改了緩存數組內容,導致 valueOf(0) 返回被篡改的對象。

臨時修復

項目組最終決定在關鍵位置用反射將緩存值改回:

Field cacheField = IntegerCache.class.getDeclaredField("cache");
cacheField.setAccessible(true);
Integer[] cache = (Integer[]) cacheField.get(null);
cache[128] = 0; // index = value + 128

根治需排查第三方 SDK 或禁止反射篡改基礎類緩存。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved