[英]How do annotations prevent mutations of an array parameter?
我理解注释是不可变的,但是,Java中的数组本身并不是不可变的。 运行测试后,我注意到从注释参数返回的数组可以变异,但它不会影响源数组:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface ArrayAnnotation {
String[] value() default {};
}
@ArrayAnnotation({"foo"})
public class Main {
public static void main(String[] args) {
ArrayAnnotation test = Main.class.getAnnotation(ArrayAnnotation.class);
String[] test0 = test.value();
test0[0] = "bar";
System.out.println(test0[0]);
String[] test1 = test.value();
System.out.println(test1[0]);
}
}
这打印:
bar
foo
幕后发生了什么事? 在每次调用value()
是否只发生了一个数组副本,还是更复杂?
在每次调用value()时是否只发生了一个数组副本,还是更复杂?
是的,数组被复制。
注释是一种特殊的interface
类型。 ( JLS )
它们在运行时由一些Proxy
类实现。 如果在Proxy.newProxyInstance()
设置断点,则可以对其进行调试。
注释的调用被AnnotationInvocationHandler
拦截,后者复制数组:
if (result.getClass().isArray() && Array.getLength(result) != 0)
result = cloneArray(result);
你是对的,每次都会返回一份副本以确保它没有被更改。
在Java的未来版本中,可能会优化此副本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.