> On Apr 10, 2019, at 2:49 PM, Gary Gregory <garydgreg...@gmail.com> wrote:
> 
> The test will fail on Java 14 and above when it comes out. We do not want
> to update this method with each new release. We need a "if java is >= 12"
> test IMO.

+1

> 
> Gary
> 
> On Wed, Apr 10, 2019, 14:46 <chtom...@apache.org> wrote:
> 
>> This is an automated email from the ASF dual-hosted git repository.
>> 
>> chtompki pushed a commit to branch master
>> in repository https://gitbox.apache.org/repos/asf/commons-lang.git
>> 
>> 
>> The following commit(s) were added to refs/heads/master by this push:
>>     new 5f7812e  LANG-1447: java 12 final modifier is no longer mutable
>> 5f7812e is described below
>> 
>> commit 5f7812ee1c2f583e1a1902c96b5b519e86699250
>> Author: Tompkins <chtom...@apache.org>
>> AuthorDate: Wed Apr 10 14:46:12 2019 -0400
>> 
>>    LANG-1447: java 12 final modifier is no longer mutable
>> ---
>> src/changes/changes.xml                            |  2 +
>> .../apache/commons/lang3/reflect/FieldUtils.java   | 13 ++++-
>> .../commons/lang3/reflect/FieldUtilsTest.java      | 59
>> ++++++++++++++++------
>> 3 files changed, 57 insertions(+), 17 deletions(-)
>> 
>> diff --git a/src/changes/changes.xml b/src/changes/changes.xml
>> index 6138bd4..4668d5b 100644
>> --- a/src/changes/changes.xml
>> +++ b/src/changes/changes.xml
>> @@ -46,6 +46,8 @@ The <action> type attribute can be add,update,fix,remove.
>>   <body>
>> 
>>   <release version="3.9" date="????-??-??" description="??">
>> +    <action issue="LANG-1447" type="update"
>> dev="chtompki">FieldUtils.removeFinalModifier(Field, boolean), in java 12
>> +      throw exception because the final modifier is no longer
>> mutable.</action>
>>     <action issue="LANG-1446" type="add" dev="chtompki">Switch coverage
>> from cobertura to jacoco.</action>
>>     <action issue="LANG-1442" type="add" dev="chtompki">Javadoc pointing
>> to Commons RNG.</action>
>>     <action issue="LANG-1416" type="update" dev="britter">Add more
>> SystemUtils.IS_JAVA_XX variants.</action>
>> diff --git
>> a/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
>> b/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
>> index 68146b1..99148a8 100644
>> --- a/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
>> +++ b/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
>> @@ -18,6 +18,7 @@ package org.apache.commons.lang3.reflect;
>> 
>> import org.apache.commons.lang3.ClassUtils;
>> import org.apache.commons.lang3.StringUtils;
>> +import org.apache.commons.lang3.SystemUtils;
>> import org.apache.commons.lang3.Validate;
>> 
>> import java.lang.annotation.Annotation;
>> @@ -712,8 +713,12 @@ public class FieldUtils {
>>      *            match {@code public} fields.
>>      * @throws IllegalArgumentException
>>      *             if the field is {@code null}
>> +     * @deprecated As of java 12.0, we can no longer drop the
>> <code>final</code> modifier, thus
>> +     *             rendering this method obsolete. The JDK discussion
>> about this change can be found
>> +     *             here:
>> http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-November/056486.html
>>      * @since 3.3
>>      */
>> +    @Deprecated
>>     public static void removeFinalModifier(final Field field, final
>> boolean forceAccess) {
>>         Validate.isTrue(field != null, "The field must not be null");
>> 
>> @@ -734,7 +739,13 @@ public class FieldUtils {
>>                 }
>>             }
>>         } catch (final NoSuchFieldException | IllegalAccessException
>> ignored) {
>> -            // The field class contains always a modifiers field
>> +            if (SystemUtils.IS_JAVA_12 || SystemUtils.IS_JAVA_13) {
>> +              throw new UnsupportedOperationException(
>> +                  "In java 12+ final cannot be removed.",
>> +                  ignored
>> +              );
>> +            }
>> +            // else no exception is thrown because we can modify final.
>>         }
>>     }
>> 
>> diff --git
>> a/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java
>> b/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java
>> index 8217a89..839e89d 100644
>> --- a/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java
>> +++ b/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java
>> @@ -18,6 +18,7 @@ package org.apache.commons.lang3.reflect;
>> 
>> import org.apache.commons.lang3.ArrayUtils;
>> 
>> +import org.apache.commons.lang3.SystemUtils;
>> import org.apache.commons.lang3.reflect.testbed.Ambig;
>> import org.apache.commons.lang3.reflect.testbed.Annotated;
>> import org.apache.commons.lang3.reflect.testbed.Foo;
>> @@ -43,6 +44,7 @@ import static
>> org.junit.jupiter.api.Assertions.assertNotNull;
>> import static org.junit.jupiter.api.Assertions.assertNull;
>> import static org.junit.jupiter.api.Assertions.assertThrows;
>> import static org.junit.jupiter.api.Assertions.assertTrue;
>> +import static org.junit.jupiter.api.Assertions.fail;
>> import static org.junit.jupiter.api.Assumptions.assumeTrue;
>> 
>> /**
>> @@ -993,10 +995,11 @@ public class FieldUtilsTest {
>>         final Field field =
>> StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
>>         assertFalse(field.isAccessible());
>>         assertTrue(Modifier.isFinal(field.getModifiers()));
>> -        FieldUtils.removeFinalModifier(field);
>> -        // The field is no longer final
>> -        assertFalse(Modifier.isFinal(field.getModifiers()));
>> -        assertFalse(field.isAccessible());
>> +        callRemoveFinalModifierCheckForException(field, true);
>> +        if (!SystemUtils.IS_JAVA_12 && !SystemUtils.IS_JAVA_13) {
>> +            assertFalse(Modifier.isFinal(field.getModifiers()));
>> +            assertFalse(field.isAccessible());
>> +        }
>>     }
>> 
>>     @Test
>> @@ -1004,10 +1007,11 @@ public class FieldUtilsTest {
>>         final Field field =
>> StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
>>         assertFalse(field.isAccessible());
>>         assertTrue(Modifier.isFinal(field.getModifiers()));
>> -        FieldUtils.removeFinalModifier(field, true);
>> -        // The field is no longer final
>> -        assertFalse(Modifier.isFinal(field.getModifiers()));
>> -        assertFalse(field.isAccessible());
>> +        callRemoveFinalModifierCheckForException(field, true);
>> +        if (!SystemUtils.IS_JAVA_12 && !SystemUtils.IS_JAVA_13) {
>> +            assertFalse(Modifier.isFinal(field.getModifiers()));
>> +            assertFalse(field.isAccessible());
>> +        }
>>     }
>> 
>>     @Test
>> @@ -1015,10 +1019,11 @@ public class FieldUtilsTest {
>>         final Field field =
>> StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
>>         assertFalse(field.isAccessible());
>>         assertTrue(Modifier.isFinal(field.getModifiers()));
>> -        FieldUtils.removeFinalModifier(field, false);
>> -        // The field is STILL final because we did not force access
>> -        assertTrue(Modifier.isFinal(field.getModifiers()));
>> -        assertFalse(field.isAccessible());
>> +        callRemoveFinalModifierCheckForException(field, false);
>> +        if (!SystemUtils.IS_JAVA_12 && !SystemUtils.IS_JAVA_13) {
>> +            assertTrue(Modifier.isFinal(field.getModifiers()));
>> +            assertFalse(field.isAccessible());
>> +        }
>>     }
>> 
>>     @Test
>> @@ -1026,10 +1031,32 @@ public class FieldUtilsTest {
>>         final Field field =
>> StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE");
>>         assertFalse(field.isAccessible());
>>         assertTrue(Modifier.isFinal(field.getModifiers()));
>> -        FieldUtils.removeFinalModifier(field, false);
>> -        // The field is no longer final AND we did not need to force
>> access
>> -        assertTrue(Modifier.isFinal(field.getModifiers()));
>> -        assertFalse(field.isAccessible());
>> +        callRemoveFinalModifierCheckForException(field, false);
>> +        if (!SystemUtils.IS_JAVA_12 && !SystemUtils.IS_JAVA_13) {
>> +            assertTrue(Modifier.isFinal(field.getModifiers()));
>> +            assertFalse(field.isAccessible());
>> +        }
>> +    }
>> +
>> +    /**
>> +     * Read the <code>@deprecated</code> notice on
>> +     * {@link FieldUtils#removeFinalModifier(Field, boolean)}.
>> +     *
>> +     * @param field {@link Field} to be curried into
>> +     *              {@link FieldUtils#removeFinalModifier(Field,
>> boolean)}.
>> +     * @param forceAccess {@link Boolean} to be curried into
>> +     *              {@link FieldUtils#removeFinalModifier(Field,
>> boolean)}.
>> +     */
>> +    private void callRemoveFinalModifierCheckForException(Field field,
>> Boolean forceAccess) {
>> +        try {
>> +            FieldUtils.removeFinalModifier(field, forceAccess);
>> +        } catch (UnsupportedOperationException exception) {
>> +            if(SystemUtils.IS_JAVA_12 || SystemUtils.IS_JAVA_13) {
>> +                assertTrue(exception.getCause() instanceof
>> NoSuchFieldException);
>> +            } else {
>> +                fail("No exception should be thrown for java prior to
>> 12.0");
>> +            }
>> +        }
>>     }
>> 
>> }
>> 
>> 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to