亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java 9中如何對IntegerCache進行修改詳解

2024-07-13 10:13:22
字體:
來源:轉載
供稿:網友

在開始本文的正文之前,我們下面來看看下面這段代碼:

Java中Integer類的IntegerCache的作用

包名:javascript/52392.html">javascript/53675.html">java.lang

文件名:Integer.java

方法名:IntegerCache

方法的代碼如下:

private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} } 

我們在代碼中看到,low為-128,high為127,這樣的話,在Java編程中,如果要使用-128——127這個區間的對象的話,是直接使用這個Cache中的對象的。

上面是段簡單的介紹,幫助大家理解下IntegerCache,下面開始本文的正文:

引言

5 年前,我在 Hungarian 上發表了一篇關于 JDK 中如何改變 IntegerCache 的文章。這種做法其實是深入進 Java 運行時,在實際并沒有使用的場景。當你開發這些研究代碼時,你才能更好的理解反射是如何工作的,以及 Integer 類是如何實現的。

Integer 類有一個私有的嵌套內,名為 IntegerCache ,包含了值從 -127 到 128 的 Integer 對象。

當代碼需要從 int 類型封箱成 Integer 對象,而且值在這個范圍內時,那么 Java 運行時會使用這個緩存,而不是創建一個新的 Integer 對象。這主要是處于性能優化的考慮,我們必須牢記在心的是很多 int 值在程序中很多時候都處于這個范圍內(例如數組的下標索引)。

這樣做的副作用是,很多時候,使用等號操作符來比較兩個 Integer 對象時,只要值在范圍內都是有效的。這在單元測試中很典型。而在運行模式下,當數值大于 128 時,代碼執行會失敗。

使用反射來訪問 IntegerCache 類時會導致一些奇怪的副作用,注意這會影響到整個的 JVM。如果一個 Servlet 重新定義了小的 Integer 緩存值,那么所有運行在同一個 Tomcat 下的其他 Servlet 也遭遇同樣問題。

在 Lukas Eder 和 Sitepoint 上面還有其他一些文章描述此問題。

現在我已經開始在玩弄 Java 9 的早期發布版本,在我腦海里我一直要做的就是對新的 Java 版本進行各種實驗。在開始之前,讓我們先看看在 Java 8 中的做法。

在 Lukas 的文章中,我將他的示例代碼貼在此處:

import java.lang.reflect.Field;import java.util.Random;public class Entropy { public static void main(String[] args) throws Exception { // Extract the IntegerCache through reflection Class << ? > clazz = Class.forName(  "java.lang.Integer$IntegerCache"); Field field = clazz.getDeclaredField("cache"); field.setAccessible(true); Integer[] cache = (Integer[]) field.get(clazz); // Rewrite the Integer cache for (int i = 0; i < cache.length; i++) {  cache[i] = new Integer(  new Random().nextInt(cache.length)); } // Prove randomness for (int i = 0; i < 10; i++) {  System.out.println((Integer) i); } }}

此代碼通過反射方式訪問 IntegerCache,然后使用隨機值對緩存進行填充(淘氣?。?/p>

我們嘗試在 Java 9 中執行相同的代碼,別指望有什么樂趣。當有人嘗試違反它時會發現 Java 9 的限制更加嚴格。

Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make field static final java.lang.Integer[] java.lang.Integer$IntegerCache.cache accessible: module java.base does not "opens java.lang" to unnamed module @1bc6a36e

程序拋出了異常,這個異常在 Java 8 中是不會發生的。相當于說對象是不可范文的,因為 java.base 模塊的原因,這是 JDK 的組成部分,在每個 Java 程序啟動時被自動的導入,不允許打開未命名的模塊。這個異常是在當我們嘗試設置字段可訪問屬性時拋出的。

我們在 Java 8 可輕松訪問的對象,現在在 Java 9 中不能訪問了,因為新的模塊系統對此進行了保護。代碼只能訪問字段、方法和其他用反射能訪問的信息,只有當類在相同的模塊中,或者模塊打開了包用于反射方式訪問。這個可以通過  module-info.java 模塊定義文件來實現:

module myModule { exports com.javax0.module.demo; opens com.javax0.module.demo;}

這個模塊 java.base 不用不用自行打開用于反射訪問,特別是未命名模塊更不需要。如果我們創建了一個模塊并進行命名,那么錯誤信息將包含模塊的名稱。

我們能否在程序里打開模塊呢? java.lang.reflect.Module 模塊有一個 addOpens 的方法可以做到。

可行嗎?

對開發者來說壞消息是:不可行。它只能在另外一個模塊中打開一個模塊中的包,并且包已經在該模塊中通過調用這個方法打開過。這種方法只能讓模塊傳遞給另外的模塊權利,前提是另外的模塊已經以某種方式打開過相同的包,而不能打開沒有打開過的包(譯者注:很難理解,不是嗎?)。

但與此同時好消息是:Java 9 不像 Java 8 那么容易被破解。最少這個漏洞被關閉了??雌饋?Java 開始往專業級發展,而不僅僅是個玩具(譯者注:誰說 Java 是個玩具了?)。不久的將來你可以非常嚴肅的將 RPG 和 COBOL 語言的項目遷移到 Java 上了。(很抱歉,我開玩笑的)

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。

本文翻譯自:https://dzone.com/articles/hacking-the-integercache-in-java-9


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲福利小视频| 日韩精品视频免费专区在线播放| 中文字幕日韩高清| 亚洲v日韩v综合v精品v| 91精品国产综合久久男男| 中文字幕视频一区二区在线有码| 久久久999国产精品| 国产美女高潮久久白浆| 日韩在线中文字| 国产精品一区二区久久| 九九久久久久99精品| 成人国产亚洲精品a区天堂华泰| 日韩电影免费观看在线| 欧美性猛交xxxx免费看| 欧美野外猛男的大粗鳮| 欧美激情视频在线| 国产福利成人在线| 日韩电影大全免费观看2023年上| 97精品国产97久久久久久春色| 国产精品爱啪在线线免费观看| 亚洲网在线观看| 欧美福利小视频| 精品久久久一区二区| 成人激情视频免费在线| 国产精品高潮呻吟久久av黑人| 亚洲福利小视频| 亚洲天堂av高清| 国产精品爱啪在线线免费观看| 亚洲精品午夜精品| 日韩有码在线电影| …久久精品99久久香蕉国产| 欧美人在线视频| 日本一区二区三区在线播放| 亚洲一级黄色av| 国产亚洲精品久久久优势| 日韩电影免费观看中文字幕| 久久久最新网址| 亚洲成人av在线| www.亚洲成人| 国产欧美一区二区三区视频| 91免费看国产| 亚洲另类欧美自拍| 日韩av网址在线观看| 亚洲国产精品99| 成人黄色网免费| 日韩av电影手机在线观看| 亚洲午夜精品视频| 国产精品一久久香蕉国产线看观看| 成人午夜黄色影院| 久久偷看各类女兵18女厕嘘嘘| 一区二区三区日韩在线| 欧美超级免费视 在线| 欧美另类精品xxxx孕妇| 伊人久久精品视频| 欧美激情区在线播放| 91高潮精品免费porn| 欧美在线视频免费| 久久久免费高清电视剧观看| 亚洲精品欧美日韩专区| 黑人欧美xxxx| 日韩av电影院| 国产精品第2页| 麻豆一区二区在线观看| 色多多国产成人永久免费网站| 亚洲人成伊人成综合网久久久| 97久久久久久| 91av在线播放视频| 亚洲的天堂在线中文字幕| 日韩av片永久免费网站| 国内精品久久久久伊人av| 亚洲男人天堂古典| 91在线无精精品一区二区| 欧美日韩激情美女| 亚洲另类图片色| 日韩理论片久久| 91在线观看欧美日韩| 国产97在线播放| 久久久久久亚洲精品不卡| 欧美二区乱c黑人| 亚洲欧美制服综合另类| 日韩电影中文 亚洲精品乱码| 亚洲成人精品视频在线观看| 精品视频中文字幕| 日韩免费在线电影| 国产精品96久久久久久又黄又硬| 成人国内精品久久久久一区| 久久久91精品国产| 日本aⅴ大伊香蕉精品视频| 亚洲精品美女网站| 欧美日韩免费在线观看| 国产精品黄页免费高清在线观看| 久久夜色撩人精品| 日韩在线观看免费全集电视剧网站| 国产精品扒开腿做爽爽爽视频| 亚洲成avwww人| 高清欧美一区二区三区| 久久精品国产69国产精品亚洲| 精品久久久久久久久中文字幕| 久久久免费高清电视剧观看| 国产精品视频1区| 亚洲一区二区免费| 欧美在线一级视频| 日韩精品免费视频| 国产精品免费一区| 日韩男女性生活视频| 日韩电视剧免费观看网站| 国产精品国产三级国产aⅴ浪潮| 精品日本高清在线播放| 亚洲国产精品久久久| 中文字幕亚洲欧美| 国内精品400部情侣激情| 国产不卡在线观看| 日韩av毛片网| 午夜欧美大片免费观看| 国产精品久久国产精品99gif| 亚洲精品福利视频| 亚洲精品久久久久久久久久久久久| 日本久久久久久| 欧美成人免费在线视频| 高清欧美电影在线| 亚洲少妇中文在线| 日韩综合中文字幕| 91精品国产自产在线| 国产精品一区二区三区成人| 91高潮精品免费porn| 国产精品视频白浆免费视频| 欧美国产乱视频| 欧美夜福利tv在线| 91麻豆国产精品| 日韩欧美在线看| 1769国内精品视频在线播放| 国产精品久久久久久久久久小说| 午夜精品久久久久久久久久久久久| 黑人巨大精品欧美一区二区免费| 亚洲精品之草原avav久久| 欧美在线欧美在线| 亚洲精品网站在线播放gif| 欧美性猛交xxxx免费看漫画| 久久久国产精品亚洲一区| 亚洲精品在线不卡| 韩国三级日本三级少妇99| 欧美日韩成人在线观看| 不卡av在线网站| 国产精品一香蕉国产线看观看| 国产日韩在线观看av| 97在线视频一区| 精品网站999www| 欧美日韩国产一区二区| 成人97在线观看视频| 国产美女扒开尿口久久久| 亚洲精品久久久久久久久久久久| 亚洲视频777| 精品五月天久久| 欧美一区二区视频97| 大胆欧美人体视频| 亚洲精品98久久久久久中文字幕| 国产精欧美一区二区三区| 久久天天躁狠狠躁夜夜躁| 亚洲影视九九影院在线观看| 久久精品亚洲一区| 久热在线中文字幕色999舞| 97精品国产97久久久久久| 久久久久国产视频| 亚洲欧美日韩国产中文专区|