How to hide warning “Illegal reflective access” in java 9 without JVM argument?

前端 未结 9 1306
Happy的楠姐
Happy的楠姐 2020-12-02 09:28

I just tried to run my server with Java 9 and got next warning:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective acce         


        
9条回答
  •  感情败类
    2020-12-02 10:24

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class Main {
        @SuppressWarnings("unchecked")
        public static void disableAccessWarnings() {
            try {
                Class unsafeClass = Class.forName("sun.misc.Unsafe");
                Field field = unsafeClass.getDeclaredField("theUnsafe");
                field.setAccessible(true);
                Object unsafe = field.get(null);
    
                Method putObjectVolatile = unsafeClass.getDeclaredMethod("putObjectVolatile", Object.class, long.class, Object.class);
                Method staticFieldOffset = unsafeClass.getDeclaredMethod("staticFieldOffset", Field.class);
    
                Class loggerClass = Class.forName("jdk.internal.module.IllegalAccessLogger");
                Field loggerField = loggerClass.getDeclaredField("logger");
                Long offset = (Long) staticFieldOffset.invoke(unsafe, loggerField);
                putObjectVolatile.invoke(unsafe, loggerClass, offset, null);
            } catch (Exception ignored) {
            }
        }
    
        public static void main(String[] args) {
            disableAccessWarnings();
        }
    }
    

    It works for me in JAVA 11.

提交回复
热议问题