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

为何用newInstance()创建String时,var与显式类型声明行为不同?

为什么反射创建String时显式类型与var声明会得到不同结果?

首先明确:在标准Java 17环境下,你提供的代码不可能同时通过两个测试——反射调用String的无参构造方法,无论变量用String还是var声明,返回的始终是空字符串"",第二个测试的assertEquals("A string", newString)必然失败。但针对你描述的现象,我们可以拆解核心误解点:

1. var类型推断不会改变反射调用的结果

var只是让编译器根据右侧表达式自动推断变量类型,这里constructor.newInstance()的返回值是Object(实际运行时是String实例),用var声明不会修改反射构造器调用的返回对象。无论用哪种方式声明变量,反射创建的都是空字符串对象。

2. 与字符串池无关

字符串池的作用是缓存字符串字面量,避免重复创建对象。但反射调用String无参构造创建的空字符串,和你定义的"A string"是完全不同的池内对象,二者不可能相等,所以该现象和字符串池没有关系。

可能导致你看到“两个测试都通过”的原因

  • 代码笔误:比如第二个测试中,你可能误将constructor.newInstance()写成了input(比如final var newString = input;),或者assertEquals的参数被错误修改(比如写成了assertEquals(newString, "")却误以为是"A string")。
  • 测试环境异常:比如使用了被修改过的JDK(篡改了String的无参构造逻辑),或者JUnit框架出现了异常(这种情况概率极低)。
  • 测试结果误解:可能第二个测试实际执行失败,但你误判为通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:39:37