专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
京东零售技术  ·  前沿论文分享 | ... ·  3 天前  
OSC开源社区  ·  苹果开源编程语言Swift官网全新改版 ·  3 天前  
OSC开源社区  ·  苹果用Swift重写每天数十亿次请求的Jav ... ·  2 天前  
51好读  ›  专栏  ›  OSC开源社区

在 Java 9 里对 IntegerCache 进行修改?

OSC开源社区  · 公众号  · 程序员  · 2017-05-30 08:25

正文

请到「今天看啥」查看全文


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");


//获取cache成员变量

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,然后把随机数赋值给 cache 成员变量。真调皮!


我们在 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








请到「今天看啥」查看全文