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