Java 8 zavádí změnu chování kódu, který používá metody Proxy.getProxyClass a metody Constructor.newInstance k vytvoření instance serveru proxy v případě, že volající není ve stejném balíku běhového prostředí jako neveřejné rozhraní serveru proxy.
V prostředí Java 7 vytvoří použití těchto metod třídu proxy. V prostředí Java 8 dojde k nezdaru s výjimkou IllegalAccessException.
Protože analyzátor nemůže vždy určit používaná rozhraní nebo jejich viditelnost, označí toto pravidlo všechna vyvolání objektu Constructor.newInstance(InvocationHandler), s výjimkou případů, kdy jsou tato rozhraní definována jako přístupná. Pravidlo neoznačí vyvolání metody Constructor.newInstance(InvocationHandler), před kterou je uvedena stejná metoda, jako je volání následujících metod:
Proxy.getProxyClass(ClassLoader, Class...) definující rozhraní jako literály s možností přístupuConstructor.setAccessible(true)
Zkontrolujte označený kód a zjistěte, zda je metoda getProxyClass volána z jiných balíků běhového prostředí a zda některé z těchto rozhraní proxy není veřejné. Například rozhraní na úrovni balíku, které nemá klíčové slovo public, je neveřejné.
Chcete-li vytvořit třídu proxy v prostředí Java 8, použijte jednu z následujících technik:
Constructor.setAccessible(true) nastavte přístupný příznak. Proxy.newProxyInstance.
Je-li přítomen správce zabezpečení, potřebují obě řešení oprávnění ReflectPermission("newProxyInPackage.{package name}"), abyste se vyhnuli výjimce SecurityException.
Následující příklad ukazuje, jak můžete změnit kód, pokud metoda proxyClass vytváří instanci neveřejného rozhraní:
Další informace viz dokumentace Java, kde jsou uvedeny následující třídy: