Can @Stable (or something similar) be made accessible?

Jason Greene jason.greene at redhat.com
Fri Jan 12 04:33:17 UTC 2018


MethodHandle.invokeExact() can match the performance of direct invocation, but it requires constant folding to do so. Otherwise results are similar to Java reflection(e.g [1]).

While TrustFinalNonStaticFields can be used, it’s a sledgehammer where a scalpel is really be more appropriate. 

The internal @Stable facility provides the desired semantics and precision, but it is heavily locked down, with privileged code checks and export restrictions. Could this be made more accessible (or perhaps a variant restricted to just final fields)? Informing the compiler that a final field is a true lazy initialized constant, with no store-to-final seems a pretty useful construct in general. I can understand that the long term desire is that this shouldn’t be necessary, and should be inferred [3], but at that point the annotation is still useful as documentation and legacy compatibility. If nothing else could it be allowed in non-privileged code via some flag? 
It seems odd that the much more aggressive facility (TrustFinalNonStaticFields) is simpler to use than a more targeted one.

Thanks! 

[1] https://www.optaplanner.org/blog/2018/01/09/JavaReflectionButMuchFaster.html
[2] http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/65464a307408/src/java.base/share/classes/jdk/internal/vm/annotation/Stable.java 
[3] https://bugs.openjdk.java.net/browse/JDK-8058164


More information about the core-libs-dev mailing list