5. このような警告メッセージを
見たことありませんか?
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.jruby.ext.openssl.SecurityHelper (file:/tmp/jruby-1/
jruby5029500797019692358jopenssl.jar) to field java.security.MessageDigest.provider
WARNING: Please consider reporting this to the maintainers of
org.jruby.ext.openssl.SecurityHelper
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
5
15. モジュールの分類
System Modules
Unnamed Modules Automatic Modules
Named Modules
module-
info
fizz
module-
info
module-
info
15
module-
info
⁉
モジュール名がない!
経過措置:将来は削除される予定だが、JDK 16 でも継続される
JARファイル名 モジュール名
17. モジュールの分類
System Modules
Unnamed Modules Automatic Modules
Named Modules
module-
info
fizz
module-
info
module-
info
17
module-
info
⁉
モジュール名がない! JARファイル名 モジュール名
再掲載
18. module-
info
Automatic Modules
Unnamed Modules → Automatic Modules
Unnamed Modules
18
⁉
module-
info
モジュール名がない!
Unnamed Modules は、
Automatic Modules を含む全てのモジュールを
参照(requires)と定義されている
JARファイル名 モジュール名
module fileA {
exports *;
opens *;
}
全てのパッケージを公開
全てのパッケージへの Deep Reflection を許可
<凡例> :モジュール定義に従いアクセス制御される
Direct
Reflection
Deep
Reflection
19. module-
info
Automatic Modules
Automatic Modules → Unnamed Modules
Unnamed Modules
19
Direct
Reflection
Deep
Reflection
module ⁉ {
exports *;
opens *;
}
全てのパッケージを公開
全てのパッケージへの Deep Reflection を許可
⁉
module-
info
Automatic Modules は、
Unnamed Modules を含む全てのモジュールを
参照(requires)と定義されている
モジュール名がない! JARファイル名 モジュール名
<凡例> :モジュール定義に従いアクセス制御される
20. Unnamed Modules → Named Modules
⁉
module-
info
モジュール名がない!
fizz
module-
info
Named Modules
Unnamed Modules は、
Named Modules を含む全てのモジュールを
参照(requires)と定義されている
<凡例> :モジュール定義に従いアクセス制御される
Direct
Reflection
Deep
Reflection
module fizz {
exports D;
opens D;
}
モジュール定義の内容は、
モジュール毎に異なる
Unnamed Modules
20
21. module-
info
Automatic Modules
Automatic Modules → Named Modules
21
JARファイル名 モジュール名
<凡例> :モジュール定義に従いアクセス制御される
fizz
module-
info
Named Modules
Direct
Reflection
Deep
Reflection
Automatic Modules は、
Named Modules を含む全てのモジュールを
参照(requires)と定義されている
module fizz {
exports D;
opens D;
}
モジュール定義の内容は、
モジュール毎に異なる
22. Named Modules → Unnamed Modules
Unnamed Modules
fizz
module-
info
Named Modules
22
Direct
Reflection
Deep
Reflection
⁉
<凡例> :Named Modules のモジュール定義にて requires 指定できないので、アクセスできない
module ⁉ {
exports *;
opens *;
}
Unnamed Modules は、
モジュール名がない
module-
info
モジュール名がない!
Named Modules は、
参照したいモジュールを
requires で定義する必要がある
23. module-
info
Automatic Modules
Named Modules → Automatic Modules
23
JARファイル名 モジュール名
<凡例> :モジュール定義に従いアクセス制御される
fizz
module-
info
Named Modules
module fizz {
exports D;
opens D;
requires fileA;
}
Named Modules は、
参照したいモジュールを
requires で定義する必要がある
module fileA {
exports *;
opens *;
}
全てのパッケージを公開
全てのパッケージへの Deep Reflection を許可
Direct
Reflection
Deep
Reflection
24. module-
info
Automatic Modules
Automatic Modules → System Modules
24
Direct
Reflection
Deep
Reflection
Automatic Modules は、
System Modules を含む全てのモジュールを
参照(requires)と定義されている
JARファイル名 モジュール名
System Modules
module-
info
module buzz {
exports D;
}
モジュール定義の内容は、
モジュール毎に異なる
<凡例> :モジュール定義に従いアクセス制御される
25. Unnamed Modules → System Modules
25
System Modules
module-
info
Unnamed Modules
⁉
module-
info
モジュール名がない!
module buzz {
exports D;
}
Unnamed Modules は、
System Modules を含む全てのモジュールを
参照(requires)と定義されている
Direct
Reflection
Deep
Reflection
!
--illegal-access=permit
JDK 15 以前の挙動
! !
<凡例> :モジュール定義に反して常にアクセス可能(警告メッセージ)
!
26. モジュール定義に反して常にアクセス可能
$ java --show-version Main2.java
openjdk 15.0.2 2021-01-19
OpenJDK Runtime Environment (build 15.0.2+7-27)
OpenJDK 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by Main2 (file:/2021/Main2.java) to method
java.util.concurrent.ThreadPoolExecutor.addWorker(java.lang.Runnable,boolean)
WARNING: Please consider reporting this to the maintainers of Main2
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
26
27. Unnamed Modules → System Modules
27
System Modules
module-
info
Unnamed Modules
⁉
module-
info
モジュール名がない!
module buzz {
exports D;
}
モジュール定義の内容は、
モジュール毎に異なる
Unnamed Modules は、
System Modules を含む全てのモジュールを
参照(requires)と定義されている
Direct
Reflection
Deep
Reflection
--illegal-access=deny
JDK 16 以降の挙動
<凡例> :モジュール定義に従いアクセス制御される
28. モジュール定義に従いアクセス制御される
$ java --show-version Main2.java
openjdk 16 2021-03-16
OpenJDK Runtime Environment (build 16+35-2229)
OpenJDK 64-Bit Server VM (build 16+35-2229, mixed mode, sharing)
java.lang.reflect.InaccessibleObjectException: Unable to make private boolean
java.util.concurrent.ThreadPoolExecutor.addWorker(java.lang.Runnable,boolean) accessible: module java.base
does not "opens java.util.concurrent" to unnamed module @7f416310
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
at Main3.main(Main2.java:18)
28
RuntimeException
47. JDK 16 では、やっぱり例外発生!
$ java --show-version Main3.java
openjdk 16 2021-03-16
OpenJDK Runtime Environment (build 16+35-2229)
OpenJDK 64-Bit Server VM (build 16+35-2229, mixed mode, sharing)
java.lang.reflect.InaccessibleObjectException: Unable to make private boolean
java.util.concurrent.ThreadPoolExecutor.addWorker(java.lang.Runnable,boolean) accessible: module java.base
does not "opens java.util.concurrent" to unnamed module @7f416310
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
at Main3.main(Main3.java:18)
47
RuntimeException
49. JDK 16 では --illegal-access は deprecated
$ java --show-version --illegal-access=permit Main3.java
OpenJDK 64-Bit Server VM warning: Option --illegal-access is deprecated and will be removed in a future release.
openjdk 16 2021-03-16
OpenJDK Runtime Environment (build 16+35-2229)
OpenJDK 64-Bit Server VM (build 16+35-2229, mixed mode, sharing)
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by Main3 (file:/2021/Main3.java) to method
java.util.concurrent.ThreadPoolExecutor.addWorker(java.lang.Runnable,boolean)
WARNING: Please consider reporting this to the maintainers of Main3
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
49
警告メッセージ(初回アクセス分のみ)
58. 参考情報
JDK 16 - OpenJDK -
https://openjdk.java.net/projects/jdk/16/
JEP 396: Strongly Encapsulate JDK Internals by Default
https://openjdk.java.net/jeps/396
Relaxed Strong encapsulation - JEP 261: Module System -
https://openjdk.java.net/jeps/261#Relaxed-strong-encapsulation
58
59. 参考情報
JEP 260: Encapsulate Most Internal APIs
https://openjdk.java.net/jeps/260
Replace uses of the JDK’s internal APIs - Java Dependency Analysis Tool -
https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
Internal packages that will no longer be open by default
/ Exported packages that will no longer be open by default
https://cr.openjdk.java.net/~mr/jigsaw/jdk8-packages-denied-by-default
59