Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 注释如何防止数组参数的突变?_Java_Arrays_Annotations_Immutability - Fatal编程技术网

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

我知道注释是不可变的,但是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()
时都会发生一个数组副本,还是更复杂的事情?

没错,它每次都会返回一个副本,以确保它不被更改

在Java的未来版本中,这个副本可能会被优化掉

是在每次调用value()时都会发生一个数组拷贝,还是更复杂

是,阵列已复制


注释是一种特殊的
接口类型。()

它们在运行时由一些类实现。 如果在
Proxy.newProxyInstance()
处设置断点,则可以对其进行调试

对注释的调用被截获,复制数组:

if (result.getClass().isArray() && Array.getLength(result) != 0)
     result = cloneArray(result);

啊,很酷!我的IDE调试器中的“单步执行”功能没有触发
values()
的任何内容,但是直接在
AnnotationInvocationHandler
代理中添加断点就可以了!谢谢!是的,我在想,每次查看阵列时都要复制它似乎非常昂贵!