В Java 8 изменена логика для кода, который использует методы Proxy.getProxyClass и Constructor.newInstance для создания экземпляра посредника, если инициатор и интерфейс
посредника, объявленный без спецификатора public, находятся в разных пакетах среды выполнения.
В Java 7 применение этих методов приводило к созданию класса посредника. В Java 8 возникает
исключительная ситуация IllegalAccessException.
Поскольку анализатор не всегда может определить используемые интерфейсы и их область видимости,
данное правило помечает все вызовы метода Constructor.newInstance(InvocationHandler),
за исключением случаев, когда они определены как доступные. Правило не помечает вызовы метода
Constructor.newInstance(InvocationHandler), перед которыми в коде объемлющего метода
есть вызовы следующих методов:
Proxy.getProxyClass(ClassLoader, Class...), определяющего интерфейсы как
литералы доступного типаConstructor.setAccessible(true)
Проверьте, есть ли в помеченном коде вызовы метода getProxyClass из других пакетов
среды выполнения и есть ли интерфейсы посредников без спецификатора public. Например, интерфейс
уровня пакета без спецификатора public.
Для создания класса посредника в Java 8 используйте один из следующих приемов:
Constructor.setAccessible(true) для установки флага доступности. Proxy.newProxyInstance.
Если есть администратор защиты, оба решения требуют прав доступа ReflectPermission("newProxyInPackage.{имя-пакета}").
В противном случае возникнет исключительная ситуация SecurityException.
В следующем примере показано, как изменить код, если метод proxyClass
создает экземпляр интерфейса, который объявлен без спецификатора public:
Дополнительную информацию можно найти в документации Java для следующих классов: