最新国产好看的视频,伊人天堂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 類有一個私有的嵌套內(nèi),名為 IntegerCache ,包含了值從 -127 到 128 的 Integer 對象。

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

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

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

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

現(xiàn)在我已經(jīng)開始在玩弄 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,然后使用隨機值對緩存進行填充(淘氣?。?/p>

我們嘗試在 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ā)者來說壞消息是:不可行。它只能在另外一個模塊中打開一個模塊中的包,并且包已經(jīng)在該模塊中通過調(diào)用這個方法打開過。這種方法只能讓模塊傳遞給另外的模塊權利,前提是另外的模塊已經(jīng)以某種方式打開過相同的包,而不能打開沒有打開過的包(譯者注:很難理解,不是嗎?)。

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

總結

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

本文翻譯自: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是網(wǎng)格式布局,它把父組件分成一個表格,默認情況下每個子組件占據(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

最新評論

承德县| 舒兰市| 理塘县| 临泉县| 尚义县| 花莲市| 牡丹江市| 平顺县| 汤原县| 茌平县| 五莲县| 麻栗坡县| 扶余县| 繁峙县| 榆中县| 报价| 明水县| 石楼县| 富平县| 竹山县| 鹤岗市| 耿马| 武冈市| 新巴尔虎右旗| 陈巴尔虎旗| 锡林郭勒盟| 镇雄县| 娄底市| 隆林| 安阳县| 台北县| 虎林市| 改则县| 左权县| 莒南县| 隆德县| 汕尾市| 洱源县| 平原县| 沙坪坝区| 海伦市|