为什么注释字符串值没有实现? [英] Why are annotation string values not interned?
问题描述
以下代码段打印出4个不同的哈希码,尽管重用了字符串常量和字面值。为什么字符串值没有在注释元素上实现?
The following snippet prints 4 distinct hash codes, despite reusing a string constant and literal. Why are string values not interned on annotation elements?
public class Foo {
@Retention(RetentionPolicy.RUNTIME)
@interface Bar {
String CONSTANT = "foo";
String value() default CONSTANT;
}
public static void main(String[] args) throws Exception {
System.out.println(System.identityHashCode(Bar.CONSTANT));
System.out.println(System.identityHashCode(Foo.class.getMethod("test1").getAnnotation(Bar.class).value()));
System.out.println(System.identityHashCode(Foo.class.getMethod("test2").getAnnotation(Bar.class).value()));
System.out.println(System.identityHashCode(Foo.class.getMethod("test3").getAnnotation(Bar.class).value()));
}
@Bar
public void test1() {}
@Bar("foo")
public void test2() {}
@Bar(Bar.CONSTANT)
public void test3() {}
}
推荐答案
字符串文字是实体的,但注释需要解析,它们存储在字节数组中。如果您查看类 java.lang.reflect.Method
,您可以看到:
String literal are interned but annotations are subject to parse and they are stored in byte arrays. If you look at the class java.lang.reflect.Method
you can see this:
private byte[] annotations;
private byte[] parameterAnnotations;
private byte[] annotationDefault;
另请参阅方法 public Object getDefaultValue()$查看AnnotationParser如何被调用的同一类的c $ c>。流程一直持续到这里
AnnotationParser.parseConst 并输入
Take also a look at the method public Object getDefaultValue()
of the same class to see how the AnnotationParser is called. The flow continues till here
AnnotationParser.parseConst and enter in
case 's':
return constPool.getUTF8At(constIndex);
方法 ConstantPool.getUTF8At
是一个委托本土方法。你可以在这里看到代码本机实现getUFT8At 。解析的常量永远不会被实现,并且永远不会从StringTable(其中字符串被实现)中检索。
The method ConstantPool.getUTF8At
is a delegate to a native method. You can see the code here native implementation getUFT8At. The parsed constant is never interned and is never retrieved from the StringTable (where string are interned).
我认为它可以是实现的选择。已经创建了Interning以在String literal之间进行更快速的比较,因此仅用于在方法实现中可用的实体文字。
I think it could be a choice of implementation. Interning has been created to make more fast comparison between String literal and so is used only for interning literal usable in method implementation.
这篇关于为什么注释字符串值没有实现?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!