<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>