使用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
相关产品推荐
相关产品推荐

