Unsafe and JPMS
Alan Bateman
Alan.Bateman at oracle.com
Fri Jan 19 19:52:35 UTC 2018
On 19/01/2018 18:31, Jeremy Manson wrote:
> :
>
> 1)
> testStaticsDiscovery(com.google.common.profile.HeapInspectorTest)java.lang.reflect.InaccessibleObjectException:
> Unable to make field final jdk.internal.loader.URLClassPath
> jdk.internal.loader.ClassLoaders$AppClassLoader.ucp accessible: module
> java.base does not "opens jdk.internal.loader" to unnamed module
> @3e11f9e9; did you mean
> --add-opens=java.base/jdk.internal.loader=ALL-UNNAMED
> at
> java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:345)
> at
> java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281)
> at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176)
> at java.base/java.lang.reflect.Field.setAccessible(Field.java:170)
> at
> com.google.common.profile.HeapInspector.getClassFields(HeapInspector.java:1234)
The class name hints that this is a HeapInspector walking the object
graph. I assume it's not deliberately trying to hack the ucp field (btw:
is the "did you mean ..." line a Google customization?)
The tool may have worked unchanged since JDK 1.4 but it now finds itself
in a new world where there are modules that are trying to encapsulate
their internals. In this case the java.base module does not want to open
jdk.internal.loader (it's new in JDK 9 so this is why it is not open).
This is the tension that is discussed here many times. All I'm saying is
that the path for diagnostic tooling like this is the tool agent route.
Tool agents get encapsulation busting powers at the cost of using tool
APIs and being deployed as agents.
>
> If Launcher-Agent-Class is for executable JAR files, then that's
> basically a non-starter for library classes, too.
>
> Also, it's worth pointing out that even if it feels wrong to you, it
> has worked in the platform for many years - the cost I'm talking about
> was written for Java 4, and hasn't needed to be changed since then.
>
> I also think that diagnostic code is a red herring here. The OSS use
> cases I pointed to are not in diagnostic code.
Sure, diagnostics tools are special but at least there are APIs and
deployment options for these types of tools.
One of the libraries you listed seems to a serialization library. The
conflict between legacy serialization and encapsulation is
irreconcilable. While somewhat sad, this means that custom serialization
libraries need to use the updated ReflectionFactory APIs in conjunction
with unsafe. The API additions are in JDK 9 and were back-ported to JDK
8u to make it easier for serialization libraries that want to compile
to JDK 8. I can't tell if the library you listed has been updated to use
these APIs or not.
-Alan
More information about the jigsaw-dev
mailing list