Terlepas dari pemahaman tentang akses antar modul dan paketnya masing-masing. Saya percaya inti dari itu terletak pada Sistem Modul # Santai-kuat-enkapsulasi dan saya hanya akan memilih bagian yang relevan untuk mencoba dan menjawab pertanyaan itu.
Apa yang mendefinisikan akses reflektif ilegal dan keadaan apa yang memicu peringatan?
Untuk membantu migrasi ke Java-9, enkapsulasi yang kuat dari modul dapat dilonggarkan.
Implementasi dapat menyediakan akses statis , yaitu bytecode yang dikompilasi.
Dapat menyediakan sarana untuk menjalankan sistem waktu berjalannya dengan satu atau lebih paket dari satu atau lebih modulnya yang terbuka untuk kode di semua modul yang tidak disebutkan namanya , yaitu ke kode pada jalur kelas. Jika sistem run-time dipanggil dengan cara ini, dan jika dengan melakukan itu beberapa pemanggilan API refleksi berhasil, jika tidak maka akan gagal.
Dalam kasus seperti itu, Anda sebenarnya akhirnya membuat akses reflektif yang "ilegal" karena dalam dunia modular murni Anda tidak dimaksudkan untuk melakukan akses tersebut.
Bagaimana semuanya saling terkait dan apa yang memicu peringatan dalam skenario apa?
Pelonggaran enkapsulasi ini dikontrol pada waktu proses oleh opsi peluncur baru --illegal-access
yang sama dengan default di Java9 permit
. The permit
modus Memastikan
Operasi akses reflektif pertama ke paket seperti itu menyebabkan peringatan dikeluarkan, tetapi tidak ada peringatan yang dikeluarkan setelah titik itu. Peringatan tunggal ini menjelaskan cara mengaktifkan peringatan lebih lanjut. Peringatan ini tidak dapat diredam.
Mode dapat dikonfigurasi dengan nilai debug
(pesan serta pelacakan tumpukan untuk setiap akses tersebut), warn
(pesan untuk setiap akses tersebut), dan deny
(menonaktifkan operasi tersebut).
Beberapa hal untuk di-debug dan diperbaiki pada aplikasi adalah: -
- Jalankan dengan
--illegal-access=deny
untuk mengetahui tentang dan menghindari membuka paket dari satu modul ke modul lain tanpa deklarasi modul termasuk direktif ( opens
) atau penggunaan eksplisit--add-opens
argumen VM.
- Referensi statis dari kode yang dikompilasi ke API internal JDK dapat diidentifikasi menggunakan
jdeps
alat dengan --jdk-internals
opsi tersebut
Pesan peringatan yang dikeluarkan ketika operasi akses reflektif ilegal terdeteksi memiliki bentuk berikut:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
dimana:
$PERPETRATOR
adalah nama jenis yang sepenuhnya memenuhi syarat yang berisi kode yang memanggil operasi reflektif yang dimaksud ditambah sumber kode (yaitu, jalur file JAR), jika tersedia, dan
$VICTIM
adalah string yang menjelaskan anggota yang diakses, termasuk nama yang sepenuhnya memenuhi syarat dari tipe penutup
Pertanyaan untuk contoh peringatan seperti itu: = JDK9: Operasi akses reflektif ilegal telah terjadi. org.python.core.PySystemState
Terakhir dan catatan penting, saat mencoba memastikan bahwa Anda tidak menghadapi peringatan seperti itu dan aman di masa depan, yang perlu Anda lakukan adalah memastikan modul Anda tidak membuat akses reflektif ilegal tersebut. :)