1. ホーム
  2. java

不正な反射の警告を無視する 不正な反射アクセス操作が発生した

2022-02-22 19:36:36
<パス

Illegal reflection警告は何も影響しないようです。

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.xnio.nio.NioXnio$2 (file:/Users/jixianzhilu/.m2/repository/org/jboss/xnio/xnio-nio/3.3.8.Final /xnio-nio-3.3.8.Final.jar) to constructor sun.nio.ch.KQueueSelectorProvider()
WARNING: Please consider reporting this to the maintainers of org.xnio.nio.NioXnio$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release


この警告は無視する jdk11 に適用されます。

	import java.lang.reflect.Field;
	import java.lang.reflect;
	/**
	 * Ignore illegal reflection warnings for jdk11
	 */
    @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) {
        }
    }


例)springbootで有効化する場合

	public static void main(String[] args) {
		disableAccessWarnings();
		SpringApplication.run(Application_Launcher.class, args);
		
	}