> ### Current Status > In core reflection, there are a few holes with the documentation on the type > conversions performed on the different setters. They generally follow this > process: > > 1. The Object-valued setters checks the destination type. If that type is > primitive, unbox the object. > 2. Perform identity or (primitive/reference, depending on destination type) > widening conversions. > > For each step, they can fail with IllegalArgumentException, which has been > the long standing behavior. > > Note that this process is more restrictive than the JLS 5.2 assignment > context, which allows boxing conversions, while the primitive reflective > setters consistently reject them. > > ### Problems > There are some problems with current specs: > 1. No mention that boxing is never done for primitive-typed setters > 2. Array.set missing description for the final identity or widening > conversion (reference or primitive) and the associated IAE condition > 3. Class specification of field mentions widening/narrowing conversion rules > that is not sensible for get/set Object accessors > 4. Field.set misses the identity or widening in IAE clause (but mentioned in > main body) > 5. Field primitive setters incorrectly claim they are equivalent to > set(instance, wrapper) which is wrong due to lack of boxing conversion > 6. Field primitive setters refer to nonsense "unwrapping conversion" > > ### Solutions > 1. Make sure the unbox -> identity/widen process and the IAE conditions are > present in both Field and Array.set > 2. Add that boxing is absent for all primitive setters > 3. Update Field class spec to mention the narrowing/widening conversion > limits are for primitive accessors only > 4. Fix the Field primitive setters' "unwrapping conversion" to be "identity > or primitive widening conversion" as in Array primitive setters > 5. Qualify the Field primitive setters assertion with "if this field is of a > primitive type" to make it correct
Chen Liang has updated the pull request incrementally with one additional commit since the last revision: the narrowing conversion restriction is primitive-only ------------- Changes: - all: https://git.openjdk.org/jdk/pull/28029/files - new: https://git.openjdk.org/jdk/pull/28029/files/9f925617..5559e613 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=28029&range=01 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=28029&range=00-01 Stats: 3 lines in 1 file changed: 0 ins; 0 del; 3 mod Patch: https://git.openjdk.org/jdk/pull/28029.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/28029/head:pull/28029 PR: https://git.openjdk.org/jdk/pull/28029
