国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java 9中如何對(duì)IntegerCache進(jìn)行修改詳解

Java 9中如何對(duì)IntegerCache進(jìn)行修改詳解

2021-02-26 13:13Peter Verhas JAVA教程

這篇文章主要給大家介紹了關(guān)于Java 9中如何對(duì)IntegerCache進(jìn)行修改的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用java9具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。

在開(kāi)始本文的正文之前,我們下面來(lái)看看下面這段代碼:

Java中Integer類的IntegerCache的作用

包名:java.lang

文件名:Integer.java

方法名:IntegerCache

方法的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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() {}
}

我們?cè)诖a中看到,low為-128,high為127,這樣的話,在Java編程中,如果要使用-128——127這個(gè)區(qū)間的對(duì)象的話,是直接使用這個(gè)Cache中的對(duì)象的。

上面是段簡(jiǎn)單的介紹,幫助大家理解下IntegerCache,下面開(kāi)始本文的正文:

引言

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

Integer 類有一個(gè)私有的嵌套內(nèi),名為 IntegerCache ,包含了值從 -127 到 128 的 Integer 對(duì)象。

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

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

使用反射來(lái)訪問(wèn) IntegerCache 類時(shí)會(huì)導(dǎo)致一些奇怪的副作用,注意這會(huì)影響到整個(gè)的 JVM。如果一個(gè) Servlet 重新定義了小的 Integer 緩存值,那么所有運(yùn)行在同一個(gè) Tomcat 下的其他 Servlet 也遭遇同樣問(wèn)題。

Lukas EderSitepoint 上面還有其他一些文章描述此問(wèn)題。

現(xiàn)在我已經(jīng)開(kāi)始在玩弄 Java 9 的早期發(fā)布版本,在我腦海里我一直要做的就是對(duì)新的 Java 版本進(jìn)行各種實(shí)驗(yàn)。在開(kāi)始之前,讓我們先看看在 Java 8 中的做法。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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);
 }
 }
}

此代碼通過(guò)反射方式訪問(wèn) IntegerCache,然后使用隨機(jī)值對(duì)緩存進(jìn)行填充(淘氣?。?/p>

我們嘗試在 Java 9 中執(zhí)行相同的代碼,別指望有什么樂(lè)趣。當(dāng)有人嘗試違反它時(shí)會(huì)發(fā)現(xiàn) Java 9 的限制更加嚴(yán)格。

?
1
2
3
4
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

程序拋出了異常,這個(gè)異常在 Java 8 中是不會(huì)發(fā)生的。相當(dāng)于說(shuō)對(duì)象是不可范文的,因?yàn)?java.base 模塊的原因,這是 JDK 的組成部分,在每個(gè) Java 程序啟動(dòng)時(shí)被自動(dòng)的導(dǎo)入,不允許打開(kāi)未命名的模塊。這個(gè)異常是在當(dāng)我們嘗試設(shè)置字段可訪問(wèn)屬性時(shí)拋出的。

我們?cè)?Java 8 可輕松訪問(wèn)的對(duì)象,現(xiàn)在在 Java 9 中不能訪問(wèn)了,因?yàn)樾碌哪K系統(tǒng)對(duì)此進(jìn)行了保護(hù)。代碼只能訪問(wèn)字段、方法和其他用反射能訪問(wèn)的信息,只有當(dāng)類在相同的模塊中,或者模塊打開(kāi)了包用于反射方式訪問(wèn)。這個(gè)可以通過(guò)  module-info.java 模塊定義文件來(lái)實(shí)現(xiàn):

?
1
2
3
4
module myModule {
 exports com.javax0.module.demo;
 opens com.javax0.module.demo;
}

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

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

可行嗎?

對(duì)開(kāi)發(fā)者來(lái)說(shuō)壞消息是:不可行。它只能在另外一個(gè)模塊中打開(kāi)一個(gè)模塊中的包,并且包已經(jīng)在該模塊中通過(guò)調(diào)用這個(gè)方法打開(kāi)過(guò)。這種方法只能讓模塊傳遞給另外的模塊權(quán)利,前提是另外的模塊已經(jīng)以某種方式打開(kāi)過(guò)相同的包,而不能打開(kāi)沒(méi)有打開(kāi)過(guò)的包(譯者注:很難理解,不是嗎?)。

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品成人免费一区二区在线播放 | 亚洲精品9999| 中文字幕av在线 | 中文免费字幕 | 美女毛片 | 国产欧美精品区一区二区三区 | 午夜草逼 | 国产精品成人av | 色吧网站 | 国产一区二区久久 | 中文字幕最新在线 | 国产精品自拍视频 | 国产一区二区精品在线观看 | 91色乱码一区二区三区 | 日韩视频在线观看 | 看黄免费 | 美女天堂| 日韩电影一区二区三区 | 精品国产乱码久久久久久丨区2区 | 一区二区三区在线视频播放 | 97人人看| 一级毛片免费视频 | 日韩欧美在线一区 | 黄色录像特级 | 欧美综合激情 | 国产精品亚洲第一区 | 色播一区二区 | 最近中文字幕免费观看 | 欧美一区二区在线播放 | 国产一区二区视频在线观看 | 青青久视频 | 久久久免费 | 亚洲免费在线观看 | 一区视频在线 | 国产精品爱久久久久久久 | 国产一区二区三区不卡在线观看 | 在线a视频 | 91精品国产一区二区 | 在线欧美视频 | 免费三片在线观看网站 | www.天天操 |