最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年12月03日 10:28:35   作者:Peter Verhas  
這篇文章主要給大家介紹了關于Java 9中如何對IntegerCache進行修改的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或使用java9具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧。

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

Java中Integer類的IntegerCache的作用

包名: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這個區(qū)間的對象的話,是直接使用這個Cache中的對象的。

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

引言

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

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

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

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

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

Lukas EderSitepoint 上面還有其他一些文章描述此問題。

現(xiàn)在我已經開始在玩弄 Java 9 的早期發(fā)布版本,在我腦海里我一直要做的就是對新的 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,然后使用隨機值對緩存進行填充(淘氣?。?。

我們嘗試在 Java 9 中執(zhí)行相同的代碼,別指望有什么樂趣。當有人嘗試違反它時會發(fā)現(xiàn) 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 中是不會發(fā)生的。相當于說對象是不可范文的,因為 java.base 模塊的原因,這是 JDK 的組成部分,在每個 Java 程序啟動時被自動的導入,不允許打開未命名的模塊。這個異常是在當我們嘗試設置字段可訪問屬性時拋出的。

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

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

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

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

可行嗎?

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

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

總結

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

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

相關文章

  • 在SpringBoot中配置日期格式化的方法詳解

    在SpringBoot中配置日期格式化的方法詳解

    通常情況下,發(fā)起一個 Http 請求,Spring Boot 會根據(jù)請求路徑映射到指定 Controller 上的某個方法的參數(shù)上,接著,Spring 會自動進行類型轉換,對于日期類型的參數(shù),Spring 默認是沒有配置如何將字符串轉換成日期類型的,本文將給大家介紹在SpringBoot中配置日期格式化的方法
    2023-10-10
  • MyBatis查詢緩存實例詳解

    MyBatis查詢緩存實例詳解

    查詢緩存的使用,主要是為了提高查詢訪問速度。這篇文章主要介紹了MyBatis查詢緩存,需要的朋友可以參考下
    2017-06-06
  • Intellij IDEA 關閉和開啟自動更新的提示?

    Intellij IDEA 關閉和開啟自動更新的提示?

    這篇文章主要介紹了Intellij IDEA 關閉和開啟自動更新的提示操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Java 實現(xiàn)簡易教務管理系統(tǒng)的代碼

    Java 實現(xiàn)簡易教務管理系統(tǒng)的代碼

    這篇文章主要介紹了Java 實現(xiàn)簡易教務管理系統(tǒng)的代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Spring之ShutDown?Hook死鎖現(xiàn)象解讀

    Spring之ShutDown?Hook死鎖現(xiàn)象解讀

    這篇文章主要介紹了Spring之ShutDown?Hook死鎖現(xiàn)象解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SWT(JFace)體驗之GridLayout布局

    SWT(JFace)體驗之GridLayout布局

    GridLayout 布局的功能非常強大,也是筆者常用的一種布局方式。GridLayout是網格式布局,它把父組件分成一個表格,默認情況下每個子組件占據(jù)一個單元格的空間,每個子組件按添加到父組件的順序排列在表格中。
    2009-06-06
  • SpringBoot2.x版本中,使用SpringSession踩的坑及解決

    SpringBoot2.x版本中,使用SpringSession踩的坑及解決

    這篇文章主要介紹了SpringBoot2.x版本中,使用SpringSession踩的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot實現(xiàn)動態(tài)配置及項目打包部署上線功能

    SpringBoot實現(xiàn)動態(tài)配置及項目打包部署上線功能

    本文講解的是如何使用Spring動態(tài)配置文件,實現(xiàn)不同環(huán)境不同配置,靈活切換配置文件;以及講述了如何使用?Maven?打包,然后上傳至Linux服務器進行部署,對SpringBoot打包部署上線過程感興趣的朋友一起看看吧
    2022-10-10
  • Spring Boot + MyBatis Plus 高效開發(fā)實戰(zhàn)從入門到進階優(yōu)化(推薦)

    Spring Boot + MyBatis Plus 高效開發(fā)實戰(zhàn)從入

    本文將詳細介紹 Spring Boot + MyBatis Plus 的完整開發(fā)流程,并深入剖析分頁查詢、批量操作、動態(tài) SQL、樂觀鎖、代碼優(yōu)化等實戰(zhàn)技巧,感興趣的朋友一起看看吧
    2025-04-04
  • MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found Error處理)

    MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not f

    這篇文章主要介紹了MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found)的Error處理方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論

洞口县| 吴堡县| 清原| 焉耆| 西吉县| 湘乡市| 济源市| 建湖县| 安阳市| 屏边| 巴彦县| 休宁县| 图木舒克市| 来宾市| 长子县| 寿宁县| 德格县| 南通市| 宕昌县| 饶河县| 江孜县| 古蔺县| 乡宁县| 许昌市| 南充市| 墨竹工卡县| 怀宁县| 峡江县| 德钦县| 吴堡县| 乌鲁木齐县| 安宁市| 承德县| 河东区| 开鲁县| 永清县| 汤原县| 白朗县| 栾川县| 额敏县| 张家川|