我有一个粗略的想法,但仍然想问是否有人知道为什么String
作为注释默认值提供的常量会更改身份,即使它们引用静态常量也是如此。
为了说明,为什么这段代码会打印true, true, false, false
.
@TestAnn
public class TestClass {
public static final String STRING_CONSTANT = "SHOULD_BE_CONSTANT";
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnn {
String value() default TestClass.STRING_CONSTANT;
}
public class OtherTestClass {
String NOT_EVEN_STATIC = TestClass.STRING_CONSTANT;
}
private void run() throws Exception {
System.out.println(STRING_CONSTANT == constantValue());
System.out.println(STRING_CONSTANT == new OtherTestClass().NOT_EVEN_STATIC);
String str1 = getClass().getAnnotation(TestAnn.class).value();
System.out.println(STRING_CONSTANT == str1);
String str2 = (String) TestAnn.class.getMethod("value").getDefaultValue();
System.out.println(STRING_CONSTANT == str2);
}
private String constantValue() {
return TestClass.STRING_CONSTANT;
}
public static void main(String[] args) throws Exception {
new TestClass().run();
}
}