How do annotations prevent mutations of an array parameter?
up vote
15
down vote
favorite
I understand that annotations are immutable, however, arrays in Java are by themselves not immutable. After running a test I notice that the array returned from an annotation parameter can be mutated but it does not effect the source array:
@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]);
}
}
This prints:
bar
foo
What is going on behind the scenes here? Is there simply an array copy happening during each call to value()
, or is it something more complex?
java arrays annotations immutability
add a comment |
up vote
15
down vote
favorite
I understand that annotations are immutable, however, arrays in Java are by themselves not immutable. After running a test I notice that the array returned from an annotation parameter can be mutated but it does not effect the source array:
@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]);
}
}
This prints:
bar
foo
What is going on behind the scenes here? Is there simply an array copy happening during each call to value()
, or is it something more complex?
java arrays annotations immutability
add a comment |
up vote
15
down vote
favorite
up vote
15
down vote
favorite
I understand that annotations are immutable, however, arrays in Java are by themselves not immutable. After running a test I notice that the array returned from an annotation parameter can be mutated but it does not effect the source array:
@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]);
}
}
This prints:
bar
foo
What is going on behind the scenes here? Is there simply an array copy happening during each call to value()
, or is it something more complex?
java arrays annotations immutability
I understand that annotations are immutable, however, arrays in Java are by themselves not immutable. After running a test I notice that the array returned from an annotation parameter can be mutated but it does not effect the source array:
@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]);
}
}
This prints:
bar
foo
What is going on behind the scenes here? Is there simply an array copy happening during each call to value()
, or is it something more complex?
java arrays annotations immutability
java arrays annotations immutability
edited Nov 22 at 19:05
asked Nov 22 at 18:59
flakes
6,48411850
6,48411850
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
up vote
12
down vote
accepted
Is there simply an array copy happening during each call to value(), or is it something more complex?
Yes, the array is copied.
Annotations are a special kind of interface
type. (JLS)
They are implemented by some Proxy
classes at runtime.
You can debug it if you set breakpoint at Proxy.newProxyInstance()
.
Invocations on annotation are intercepted by AnnotationInvocationHandler which copies arrays:
if (result.getClass().isArray() && Array.getLength(result) != 0)
result = cloneArray(result);
1
Ah, very cool! The step-into feature in my IDE's debugger wasn't triggering anything forvalues()
but adding a breakpoint directly in theAnnotationInvocationHandler
proxy does the trick! Thanks a lot!
– flakes
Nov 22 at 19:23
add a comment |
up vote
5
down vote
You are right, it returns a copy each time to ensure it is not changed.
In a future version of Java, this copy might be optimised away.
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
Nov 22 at 19:24
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
12
down vote
accepted
Is there simply an array copy happening during each call to value(), or is it something more complex?
Yes, the array is copied.
Annotations are a special kind of interface
type. (JLS)
They are implemented by some Proxy
classes at runtime.
You can debug it if you set breakpoint at Proxy.newProxyInstance()
.
Invocations on annotation are intercepted by AnnotationInvocationHandler which copies arrays:
if (result.getClass().isArray() && Array.getLength(result) != 0)
result = cloneArray(result);
1
Ah, very cool! The step-into feature in my IDE's debugger wasn't triggering anything forvalues()
but adding a breakpoint directly in theAnnotationInvocationHandler
proxy does the trick! Thanks a lot!
– flakes
Nov 22 at 19:23
add a comment |
up vote
12
down vote
accepted
Is there simply an array copy happening during each call to value(), or is it something more complex?
Yes, the array is copied.
Annotations are a special kind of interface
type. (JLS)
They are implemented by some Proxy
classes at runtime.
You can debug it if you set breakpoint at Proxy.newProxyInstance()
.
Invocations on annotation are intercepted by AnnotationInvocationHandler which copies arrays:
if (result.getClass().isArray() && Array.getLength(result) != 0)
result = cloneArray(result);
1
Ah, very cool! The step-into feature in my IDE's debugger wasn't triggering anything forvalues()
but adding a breakpoint directly in theAnnotationInvocationHandler
proxy does the trick! Thanks a lot!
– flakes
Nov 22 at 19:23
add a comment |
up vote
12
down vote
accepted
up vote
12
down vote
accepted
Is there simply an array copy happening during each call to value(), or is it something more complex?
Yes, the array is copied.
Annotations are a special kind of interface
type. (JLS)
They are implemented by some Proxy
classes at runtime.
You can debug it if you set breakpoint at Proxy.newProxyInstance()
.
Invocations on annotation are intercepted by AnnotationInvocationHandler which copies arrays:
if (result.getClass().isArray() && Array.getLength(result) != 0)
result = cloneArray(result);
Is there simply an array copy happening during each call to value(), or is it something more complex?
Yes, the array is copied.
Annotations are a special kind of interface
type. (JLS)
They are implemented by some Proxy
classes at runtime.
You can debug it if you set breakpoint at Proxy.newProxyInstance()
.
Invocations on annotation are intercepted by AnnotationInvocationHandler which copies arrays:
if (result.getClass().isArray() && Array.getLength(result) != 0)
result = cloneArray(result);
answered Nov 22 at 19:17
caco3
9501417
9501417
1
Ah, very cool! The step-into feature in my IDE's debugger wasn't triggering anything forvalues()
but adding a breakpoint directly in theAnnotationInvocationHandler
proxy does the trick! Thanks a lot!
– flakes
Nov 22 at 19:23
add a comment |
1
Ah, very cool! The step-into feature in my IDE's debugger wasn't triggering anything forvalues()
but adding a breakpoint directly in theAnnotationInvocationHandler
proxy does the trick! Thanks a lot!
– flakes
Nov 22 at 19:23
1
1
Ah, very cool! The step-into feature in my IDE's debugger wasn't triggering anything for
values()
but adding a breakpoint directly in the AnnotationInvocationHandler
proxy does the trick! Thanks a lot!– flakes
Nov 22 at 19:23
Ah, very cool! The step-into feature in my IDE's debugger wasn't triggering anything for
values()
but adding a breakpoint directly in the AnnotationInvocationHandler
proxy does the trick! Thanks a lot!– flakes
Nov 22 at 19:23
add a comment |
up vote
5
down vote
You are right, it returns a copy each time to ensure it is not changed.
In a future version of Java, this copy might be optimised away.
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
Nov 22 at 19:24
add a comment |
up vote
5
down vote
You are right, it returns a copy each time to ensure it is not changed.
In a future version of Java, this copy might be optimised away.
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
Nov 22 at 19:24
add a comment |
up vote
5
down vote
up vote
5
down vote
You are right, it returns a copy each time to ensure it is not changed.
In a future version of Java, this copy might be optimised away.
You are right, it returns a copy each time to ensure it is not changed.
In a future version of Java, this copy might be optimised away.
answered Nov 22 at 19:16
Peter Lawrey
438k55556952
438k55556952
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
Nov 22 at 19:24
add a comment |
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
Nov 22 at 19:24
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
Nov 22 at 19:24
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
Nov 22 at 19:24
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53436794%2fhow-do-annotations-prevent-mutations-of-an-array-parameter%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown