How do annotations prevent mutations of an array parameter?
up vote
13
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
13
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
13
down vote
favorite
up vote
13
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 yesterday
asked yesterday
flakes
6,46511850
6,46511850
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
up vote
10
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
yesterday
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
yesterday
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
10
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
yesterday
add a comment |
up vote
10
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
yesterday
add a comment |
up vote
10
down vote
accepted
up vote
10
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 yesterday
caco3
8361416
8361416
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
yesterday
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
yesterday
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
yesterday
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
yesterday
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
yesterday
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
yesterday
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 yesterday
Peter Lawrey
437k55551949
437k55551949
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
yesterday
add a comment |
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
yesterday
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
yesterday
Yeah, I was thinking that it seems pretty expensive to copy the array every time that it is viewed!
– flakes
yesterday
add a comment |
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