mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-14 08:18:29 +00:00
[jdk9] [opinionated] The java9 warning when using lombok about ‘inaccessible API’ is now suppressed.
This commit is contained in:
1 parent
fee0ad33ab
commit
e9d86650ff
1 file changed
+26
-1
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
package lombok.launch;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.processing.AbstractProcessor;
|
||||
@@ -37,6 +38,8 @@ import javax.lang.model.type.TypeMirror;
|
||||
|
||||
import org.mapstruct.ap.spi.AstModifyingAnnotationProcessor;
|
||||
|
||||
import sun.misc.Unsafe;
|
||||
|
||||
class AnnotationProcessorHider {
|
||||
public static class AstModificationNotifier implements AstModifyingAnnotationProcessor {
|
||||
@Override public boolean isTypeComplete(TypeMirror type) {
|
||||
@@ -65,11 +68,33 @@ class AnnotationProcessorHider {
|
||||
}
|
||||
|
||||
@Override public void init(ProcessingEnvironment processingEnv) {
|
||||
disableJava9SillyWarning();
|
||||
AstModificationNotifierData.lombokInvoked = true;
|
||||
instance.init(processingEnv);
|
||||
super.init(processingEnv);
|
||||
}
|
||||
|
||||
// sunapi suppresses javac's warning about using Unsafe; 'all' suppresses eclipse's warning about the unspecified 'sunapi' key. Leave them both.
|
||||
// Yes, javac's definition of the word 'all' is quite contrary to what the dictionary says it means. 'all' does NOT include 'sunapi' according to javac.
|
||||
@SuppressWarnings({"sunapi", "all"})
|
||||
private void disableJava9SillyWarning() {
|
||||
// JVM9 complains about using reflection to access packages from a module that aren't exported. This makes no sense; the whole point of reflection
|
||||
// is to get past such issues. The only comment from the jigsaw team lead on this was some unspecified mumbling about security which makes no sense,
|
||||
// as the SecurityManager is invoked to check such things. Therefore this warning is a bug, so we shall patch java to fix it.
|
||||
|
||||
try {
|
||||
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
|
||||
theUnsafe.setAccessible(true);
|
||||
Unsafe u = (Unsafe) theUnsafe.get(null);
|
||||
|
||||
Class<?> cls = Class.forName("jdk.internal.module.IllegalAccessLogger");
|
||||
Field logger = cls.getDeclaredField("logger");
|
||||
u.putObjectVolatile(cls, u.staticFieldOffset(logger), null);
|
||||
} catch (Throwable t) {
|
||||
// We shall ignore it; the effect of this code failing is that the user gets to see a warning they remove with various --add-opens magic.
|
||||
}
|
||||
}
|
||||
|
||||
@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
||||
return instance.process(annotations, roundEnv);
|
||||
}
|
||||
@@ -82,7 +107,7 @@ class AnnotationProcessorHider {
|
||||
ClassLoader cl = Main.createShadowClassLoader();
|
||||
try {
|
||||
Class<?> mc = cl.loadClass("lombok.core.AnnotationProcessor");
|
||||
return (AbstractProcessor) mc.newInstance();
|
||||
return (AbstractProcessor) mc.getDeclaredConstructor().newInstance();
|
||||
} catch (Throwable t) {
|
||||
if (t instanceof Error) throw (Error) t;
|
||||
if (t instanceof RuntimeException) throw (RuntimeException) t;
|
||||
|
||||
Reference in new issue
Block a user