How do annotations prevent mutations of an array parameter?
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 |
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 |
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,52111850
6,52111850
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
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 |
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 |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
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 |
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 |
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
1,1271517
1,1271517
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 |
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 |
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 |
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
441k55558959
441k55558959
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