Summary
Change com.sun.jdi.ObjectReference.setValue
to specify that it cannot be used to change final instance fields, and align it with long standing implementation behavior.
Problem
ObjectReference.setValue spec says:
Sets the value of a given instance or static field in this object. The Field must be
valid for this ObjectReference; that is, it must be from the mirrored object's class
or a superclass of that class. If static, the field must not be final.
The JDK's JDI implementation has never allowed a final field (static or instance) be changed. The current behavior, and spec vs. implementation difference, goes back to 1999.
Solution
Changes the description ObjectReference.setValue
to specify that the method cannot be used to change final fields.
Change the description of the IllegalArgumentException
to include the condition that the field is final.
Specification
old:
/**
* Sets the value of a given instance or static field in this object.
* The {@link Field} must be valid for this ObjectReference; that is,
* it must be from the mirrored object's class or a superclass of that class.
* If static, the field must not be final.
* <p>
...
* @throws java.lang.IllegalArgumentException if the field is not valid for
* this object's class.
...
*/
void setValue(Field field, Value value)
new:
/**
* Sets the value of a given instance or static field in this object.
* The {@link Field} must be valid for this ObjectReference; that is,
* it must be from the mirrored object's class or a superclass of that class.
* The field must not be final.
* <p>
...
* @throws java.lang.IllegalArgumentException if the field is not valid for
* this object's class or the field is final.
...
*/
void setValue(Field field, Value value)
- csr of
-
JDK-8280798 com.sun.jdi.ObjectReference::setValue spec should prohibit any final field modification
-
- Resolved
-