<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<br>
Hi Jason/Tomaz, <br>
<br>
<br>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
JDK 9 build <a href="https://jdk9.java.net/download/">b148</a>
includes an important Refresh of the module system [1] , summary ofÂ
changes are listed <a
href="http://download.java.net/java/jdk9/changes/jdk-9+148.html">here
</a>. <br>
<br>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<b>This refresh includes a disruptive change that is important to
understand. <br>
<br>
</b>For those that have been trying out modules with regular JDK 9
builds then be aware that `requires public` changes to `requires
transitive`. In addition, the binary representation of the module
declaration (module-info.class) has changed so that you need to
recompile any modules that were compiled with previous JDK 9 builds.
<br>
<br>
As things stand today in JDK 9 then you use setAccessible to break
into non-public elements of any type in exported packages. However,
it cannot be used to break into any type in non-exported package.
The current specified behavior was a compromise for the initial
integration of the module system. It is of course not very
satisfactory, hence the #AwkwardStrongEncapsulation issue [2] on the
JSR 376 issues list. With the updated proposal in the JSR, this
refresh changes setAccessible further so that it cannot be used to
break into non-public types, or non-public elements of public types,
in exported packages. Code that uses setAccessible to hack into the
private constructor of java.lang.invoke.MethodHandles.Lookup will be
disappointed for example.<br>
<br>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
This change will expose hacks in many existing libraries and tools.
As a workaround then a new command line option `--add-opens` can be
used to open specific packages for "deep reflection". For example, a
really popular build tool fails with this refresh because it uses
setAccessible + core reflection to hack into a private field of an
unmodifiable collection so that it can mutate it, facepalm! This
code will continue to work as before when run with `--add-opens
java.base/java.util=ALL-UNNAMED` to open the package java.util in
module java.base to "all unnamed modules" (think class path).<br>
<br>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<b>Any help reporting issues to popular tools and libraries would be
appreciated. </b><br>
<br>
A debugging aid that is useful to identify issues is to run with
-Dsun.reflect.debugModuleAccessChecks=true to get a stack trace when
setAccessible fails, this is particularly useful when code swallows
exceptions without any logging.<br>
<br>
<br>
Rgds,Rory<br>
<br>
<br>
[1] <a
href="http://mail.openjdk.java.net/pipermail/jpms-spec-experts/2016-October/000430.html">http://mail.openjdk.java.net/pipermail/jdk9-dev/2016-November/005276.html</a><br>
[2] <a
href="http://openjdk.java.net/projects/jigsaw/spec/issues/#AwkwardStrongEncapsulation">http://openjdk.java.net/projects/jigsaw/spec/issues/#AwkwardStrongEncapsulation</a><br>
<pre class="moz-signature" cols="72">--
Rgds,Rory O'Donnell
Quality Engineering Manager
Oracle EMEA , Dublin, Ireland </pre>
</body>
</html>