Java 注释如何防止数组参数的突变?
我知道注释是不可变的,但是Java中的数组本身并不是不可变的。运行测试后,我注意到从注释参数返回的数组可以进行变异,但不会影响源数组:Java 注释如何防止数组参数的突变?,java,arrays,annotations,immutability,Java,Arrays,Annotations,Immutability,我知道注释是不可变的,但是Java中的数组本身并不是不可变的。运行测试后,我注意到从注释参数返回的数组可以进行变异,但不会影响源数组: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface ArrayAnnotation { String[] value() default {}; } @ArrayAnnotation({"foo"}) public class Main { pub
@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()
时都会发生一个数组副本,还是更复杂的事情?没错,它每次都会返回一个副本,以确保它不被更改
在Java的未来版本中,这个副本可能会被优化掉
是在每次调用value()时都会发生一个数组拷贝,还是更复杂
是,阵列已复制
注释是一种特殊的
接口类型。()
它们在运行时由一些类实现。
如果在Proxy.newProxyInstance()
处设置断点,则可以对其进行调试
对注释的调用被截获,复制数组:
if (result.getClass().isArray() && Array.getLength(result) != 0)
result = cloneArray(result);
啊,很酷!我的IDE调试器中的“单步执行”功能没有触发values()
的任何内容,但是直接在AnnotationInvocationHandler
代理中添加断点就可以了!谢谢!是的,我在想,每次查看阵列时都要复制它似乎非常昂贵!