Java 8 a ajouté un changement de comportement pour le code qui utilise les méthodes
Proxy.getProxyClass et Constructor.newInstance afin de créer
une instance de proxy si l'appelant ne se trouve pas dans le même package d'exécution que l'interface
proxy non publique.
Dans Java 7, l'utilisation de ces méthodes crée la classe de proxy. Dans Java 8, elle provoque un échec et une exception
IllegalAccessException est générée.
Etant donné que l'analyseur ne peut pas toujours déterminer les interfaces utilisées ou
leur visibilité, cette règle marque tous les appels de
Constructor.newInstance(InvocationHandler), sauf lorsque ceux-ci sont
définis comme accessibles. Cette règle ne marque pas les appels de méthode
Constructor.newInstance(InvocationHandler) qui sont précédés, dans la même
méthode, d'appels aux méthodes suivantes :
Proxy.getProxyClass(ClassLoader, Class...) qui définit les interfaces comme littéraux de type accessibleConstructor.setAccessible(true)
Inspectez le code marqué afin de voir si la méthode getProxyClass est appelée à partir d'autres packages d'exécution
et de vérifier si une des interfaces de proxy est non publique. Par exemple, une interface de niveau package n'ayant pas
le mot clé public est non publique.
Pour créer une classe de proxy dans Java 8, utilisez une des techniques suivantes :
Constructor.setAccessible(true) pour définir l'indicateur accessible. Proxy.newProxyInstance.
S'il existe un gestionnaire de sécurité, les deux solutions doivent disposer du droit ReflectPermission("newProxyInPackage.{package name}") afin
d'éviter une exception SecurityException.
L'exemple suivant présente comment vous pouvez changer le code si la méthode proxyClass instancie
une interface non publique :
Pour plus d'informations, voir la documentation Java des classes suivantes :