Java 8 introduce un cambiamento nel comportamento del codice che utilizza i metodi Proxy.getProxyClass e Constructor.newInstance per la creazione di un'istanza proxy se il chiamante non è nello stesso package di runtime dell'interfaccia proxy non pubblica.
In Java 7, l'utilizzo di questi metodi determina la creazione di una classe proxy. In Java 8, l'operazione ha esito negativo con un'eccezione IllegalAccessException.
Poiché lo strumento di analisi non può sempre determinare le interfacce utilizzate o la loro visibilità, questa regola contrassegna i richiami di Constructor.newInstance(InvocationHandler) tranne quando sono definiti come accessibili. La regola non contrassegna o richiami al metodo Constructor.newInstance(InvocationHandler) preceduti nel metodo stesso da richiami ai seguenti metodi:
Proxy.getProxyClass(ClassLoader, Class...) che definisce le interfacce come valori letterali di tipo accessibileConstructor.setAccessible(true)
Controllare il codice contrassegnato per verificare se il metodo getProxyClass viene richiamato da altri package di runtime e se una delle interfacce proxy non è pubblica. Ad esempio, un'interfaccia al livello del package che non ha la parola chiave public, è non pubblica.
Per creare una classe proxy in Java 8, utilizzare una dei seguenti tecniche:
Constructor.setAccessible(true) per impostare l'indicatore accessibile. Proxy.newProxyInstance.
Se è presente un gestore della sicurezza, entrambe le soluzioni necessitano dell'autorizzazione ReflectPermission ("newProxyInPackage.{package name}") per evitare un'eccezione SecurityException.
Il seguente esempio mostra come è possibile modificare il codice se il metodo proxyClass crea un'istanza ad un'interfaccia non pubblica:
Per ulteriori informazioni, consultare la documentazione Java per le seguenti classi: