You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BodyHandlers.ofString()后HttpResponse实际类型为内部类的疑问

问题描述

以下是测试代码:

class Main{
    // 可以使用 HttpClient 类
    public static void main(String args[]) throws IOException, InterruptedException {    
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
        // .GET() 是可选的,因为默认就是GET请求
        .header("accept","application/json")
        .uri(URI.create("https://whatever.com"))
        .build();
        HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
        System.out.println(response.statusCode());
        System.out.println(response.body()); 
        System.out.println(response.getClass().getName());
    }
}

我查阅了BodyHandlers.ofString()方法的文档,理解该方法会将响应体解析为String类型。但执行以下代码:

System.out.println(response.getClass().getName());

后,输出结果为jdk.internal.net.http.HttpResponseImpl。我看到有文章提到绝不应使用jdk.internal.*包下的类,请问我是否操作有误?

解答
  • 你没有操作错误。HttpClient.send()返回的是HttpResponse接口的实例,jdk.internal.net.http.HttpResponseImpl只是JDK内部对这个接口的具体实现类,这是Java接口化编程的常规设计。
  • BodyHandlers.ofString()的作用是确保response.body()返回String类型,这和底层实现类属于内部包没有冲突。你只需要始终面向HttpResponse接口编写代码,不要在代码中直接引用HttpResponseImpl这个内部类就没问题。
  • jdk.internal.*下的类是JDK的内部实现细节,不对外公开,不同JDK版本可能会修改甚至移除这些类,所以确实不能在业务代码中直接依赖它们。但你现在只是通过getClass().getName()查看类名,这属于调试行为,不属于错误使用内部类的情况。

内容的提问来源于stack exchange,提问作者Simon Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:25:21