gpt4 book ai didi

java - 注释如何防止数组参数的突变?

转载 作者:太空狗 更新时间:2023-10-29 22:54:41 26 4
gpt4 key购买 nike

我知道注释是不可变的,但是,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() 期间是否只是发生了一个数组复制,还是更复杂的事情?

最佳答案

Is there simply an array copy happening during each call to value(), or is it something more complex?

是的,数组被复制了。


注解是一种特殊的接口(interface)类型。 ( JLS )

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

注解调用被AnnotationInvocationHandler拦截复制数组:

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

关于java - 注释如何防止数组参数的突变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53436794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com