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

