Modüller ve ilgili paketleri arasındaki erişimlerin anlaşılmasının yanı sıra. Bunun özünün Modül Sisteminde yattığına inanıyorum # Rahat-güçlü-kapsülleme ve soruyu cevaplamaya çalışmak için sadece ilgili kısımlarını seçerdim.
Yasadışı yansıtıcı erişimi ne tanımlar ve hangi koşullar uyarıyı tetikler?
Java-9'a geçişe yardımcı olmak için modüllerin güçlü kapsüllenmesi gevşetilebilir.
Bir uygulama, statik erişim sağlayabilir , yani derlenmiş bayt kodu ile.
Bir veya daha fazla modülünün bir veya daha fazla paketinin içinde koda açık olmasıyla çalışma zamanı sistemini çağırmak için bir yol sağlayabilir. Tüm adlandırılmamış modüllerde , yani sınıf yolunda kodlama. Çalışma zamanı sistemi bu şekilde çağrılırsa ve bunu yaparak, yansıma API'lerinin bazı çağrıları başarılı olur, aksi takdirde başarısız olurlar.
Bu gibi durumlarda, aslında yansıtıcı bir erişim oluşturdunuz. tamamen modüler bir dünyada bu tür erişimleri yapmanız gerekmediğinden, "yasa dışı" etmiş olursunuz.
Her şey nasıl birbirine bağlı ve hangi senaryoda uyarıyı tetikliyor?
Kapsüllemenin bu gevşemesi, çalışma zamanında --illegal-access
Java9'da varsayılan olarak şuna eşit olan yeni bir başlatıcı seçeneği ile kontrol edilir.permit
. permit
mod olmasını sağlar
Bu tür herhangi bir pakete yönelik ilk yansıtıcı erişim işlemi, bir uyarının verilmesine neden olur, ancak bu noktadan sonra hiçbir uyarı verilmez. Bu tek uyarı, başka uyarıların nasıl etkinleştirileceğini açıklar. Bu uyarı bastırılamaz.
Modlar, değerlerle yapılandırılabilir debug
(mesaj ve bu tür her erişim için yığın izleme), warn
(bu tür her erişim için mesaj) vedeny
(bu tür işlemleri devre dışı bırakır .
Uygulamalarda hata ayıklanacak ve düzeltilecek birkaç şey şunlar olabilir: -
- Açıktan
--illegal-access=deny
haberdar olmak ve açıktan kaçınmak için çalıştırın böyle bir direktif (dahil bir modül beyanı olmadan başka bir modülden ing paketleri opens
) ya da kesin kullanımı --add-opens
VM arg.
- Derlenmiş koddan JDK-dahili API'lere statik referanslar,
jdeps
şu --jdk-internals
seçenekle araç kullanılarak tanımlanabilir
Yasadışı bir yansıtıcı erişim işlemi tespit edildiğinde verilen uyarı mesajı aşağıdaki forma sahiptir:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
nerede:
$PERPETRATOR
söz konusu yansıtıcı işlemi çağıran kodu içeren türün tam nitelikli adı ve varsa kod kaynağı (yani JAR dosyası yolu) ve
$VICTIM
çevreleyen türün tam nitelikli adı da dahil olmak üzere erişilen üyeyi tanımlayan bir dizedir
Böyle bir örnek uyarı için sorular: = JDK9: Yasadışı bir yansıtıcı erişim işlemi meydana geldi. org.python.core.PySystemState
Son ve önemli bir not, bu tür uyarılarla karşılaşmamanızı ve gelecekte güvende olmanızı sağlamaya çalışırken, yapmanız gereken tek şey, modüllerinizin bu yasa dışı yansıtıcı erişimleri yapmadığından emin olmaktır. :)