Java 8 引入了如下的代码行为更改:当调用程序与非公共代理接口不在同一运行时包内时使用 Proxy.getProxyClass 和 Constructor.newInstance 方法来创建代理实例。在 Java 7 中,使用这些方法将创建代理类。在 Java 8 中,这将失败,并抛出 IllegalAccessException。
因为分析器无法始终确定所使用的接口或其可视性,所以此规则会标记对 Constructor.newInstance(InvocationHandler) 的所有调用,但当它们定义为可访问时除外。该规则不会标记调用以下方法的同一方法之前的 Constructor.newInstance(InvocationHandler) 方法的调用。
Proxy.getProxyClass(ClassLoader, Class...) 方法Constructor.setAccessible(true) 方法
请检查已标记的代码以查看是否从其他运行时包调用了 getProxyClass 方法以及是否有任何代理接口是非公共接口。例如,没有 public 关键字的包级别接口是非公共接口。
要在 Java 8 中创建代理类,请使用以下方法之一:
Constructor.setAccessible(true) 以设置可访问标记。Proxy.newProxyInstance 方便方法。
如果存在安全管理器,那么这两种解决方案都需要 ReflectPermission("newProxyInPackage.{package name}") 许可权来避免 SecurityException。
以下示例显示了当 proxyClass 方法实例化非公共接口时可如何更改代码:
有关其他信息,请参阅以下类的 Java 文档: