Java使用HttpsURLConnection发起PATCH请求出现InaccessibleObjectException如何解决
问题根因
你采用的反射修改java.net.HttpURLConnection内部私有methods字段的方案,仅适配Java 8及更早版本。从Java 9引入模块系统后,JDK严格限制了对内部非公开API的反射访问权限,你遇到的InaccessibleObjectException就是因为java.base模块默认没有开放java.net包的内部访问权限给未命名模块,升级JDK17只会让限制更严格,自然无法解决问题。
这种依赖JDK内部实现的hack方案本身就不具备版本兼容性,不推荐长期使用。
解决方案
临时兼容方案(不推荐)
在JVM启动参数中添加以下配置,手动开放java.net包的访问权限:
--add-opens java.base/java.net=ALL-UNNAMED
如果你的项目是模块化项目,将ALL-UNNAMED替换为你的模块名即可。该方案仅能临时解决当前版本的运行问题,后续JDK版本升级仍可能失效。
推荐实现方案(无兼容问题)
方案1:使用Java 11+原生HttpClient
Java 11之后官方推出的标准HttpClient原生支持PATCH请求,无需任何hack:
import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.time.Duration; public void sendPatchRequest(String url, String token, String requestBody) throws Exception { // 构建HttpClient实例 HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(5)) .build(); // 构建PATCH请求 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .timeout(Duration.ofSeconds(5)) .header("Content-Type", "application/json; utf-8") .header("Accept", "application/json") .header("Authorization", "OAuth " + token) .method("PATCH", HttpRequest.BodyPublishers.ofString(requestBody)) .build(); // 发送请求获取响应 HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); // 后续自行处理响应结果 }
方案2:HttpURLConnection无反射兼容方案
如果你必须保留HttpURLConnection的使用,可以通过HTTP方法覆写头实现,无需修改JDK内部字段,前提是服务端支持X-HTTP-Method-Override头(绝大多数REST服务端框架默认支持):
public static void connectPATCHtoken(URL url, String token) { try { HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); // 实际发送POST请求,通过头标识为PATCH请求 connection.setRequestMethod("POST"); connection.setRequestProperty("X-HTTP-Method-Override", "PATCH"); connection.setRequestProperty("Content-Type", "application/json; utf-8"); connection.setRequestProperty("Accept", "application/json"); connection.setDoOutput(true); connection.setRequestProperty("Authorization", "OAuth " + token); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); setConnection(connection); } catch (IOException e) { e.printStackTrace(); } }
方案3:使用第三方HTTP客户端库
可以选择OkHttp、Apache HttpClient等成熟的开源HTTP客户端,这些库原生支持PATCH请求,API更易用,版本兼容性也更好。
内容的提问来源于stack exchange,提问作者zvega
相关产品推荐
相关产品推荐

