现在我已经上手了 Java 9 的早期公开版本,我想到可以用新版的 Java 来做相同的侵入操作。在开始用 Java 9 侵入之前,我们先用 Java 8 做一次。
上面的代码通过反射获取了 IntegerCache,然后把随机数赋值给 cache 成员变量。
我们在 Java 9 中也能执行这些代码。但是,不要高兴得太早。当人们试图在 Java 9 中进行违规操作时,后果会更严重。
会抛出一个 Java 8 中没有的异常。说是"对象不可访问",因为 java.base 模块(每个 java 程序都会自动导入的 JDK 运行时的一部分)不会将模块打开(侵入)到未知的模块。当我们试图设置该成员变量(cache)为“可访问的”的时候,就会抛出这个异常。
在 Java 8 中轻易就能访问到的对象在 Java 9 中变得不可访问了,因为 Java 9 中模块系统会对对象进行保护。代码只有在类处于同一模块下,或为了所有模块或本模块能进行反射性访问,模块打开包时,才能访问成员变量、方法以及其他内容。这些都是在"module-info.java"模块定义文件里配置的:
“java.base”模块不会为了编程人员开放它本身,尤其是不会为了未知的模块——也就是我们自己运行的代码。如果我们为了自己的代码创建一个模块,并且对它进行命名,然后错误信息就会包括我们模块的名字(而不是说未知的模块)。