LANG-1447: java 12 final modifier is no longer mutable
This commit is contained in:
parent
20fdb8e63e
commit
5f7812ee1c
|
@ -46,6 +46,8 @@ The <action> type attribute can be add,update,fix,remove.
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<release version="3.9" date="????-??-??" description="??">
|
<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-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-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>
|
<action issue="LANG-1416" type="update" dev="britter">Add more SystemUtils.IS_JAVA_XX variants.</action>
|
||||||
|
|
|
@ -18,6 +18,7 @@ package org.apache.commons.lang3.reflect;
|
||||||
|
|
||||||
import org.apache.commons.lang3.ClassUtils;
|
import org.apache.commons.lang3.ClassUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.commons.lang3.SystemUtils;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
|
@ -712,8 +713,12 @@ public class FieldUtils {
|
||||||
* match {@code public} fields.
|
* match {@code public} fields.
|
||||||
* @throws IllegalArgumentException
|
* @throws IllegalArgumentException
|
||||||
* if the field is {@code null}
|
* 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
|
* @since 3.3
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static void removeFinalModifier(final Field field, final boolean forceAccess) {
|
public static void removeFinalModifier(final Field field, final boolean forceAccess) {
|
||||||
Validate.isTrue(field != null, "The field must not be null");
|
Validate.isTrue(field != null, "The field must not be null");
|
||||||
|
|
||||||
|
@ -734,7 +739,13 @@ public class FieldUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (final NoSuchFieldException | IllegalAccessException ignored) {
|
} 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.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ package org.apache.commons.lang3.reflect;
|
||||||
|
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
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.Ambig;
|
||||||
import org.apache.commons.lang3.reflect.testbed.Annotated;
|
import org.apache.commons.lang3.reflect.testbed.Annotated;
|
||||||
import org.apache.commons.lang3.reflect.testbed.Foo;
|
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.assertNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
import static org.junit.jupiter.api.Assumptions.assumeTrue;
|
import static org.junit.jupiter.api.Assumptions.assumeTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -993,10 +995,11 @@ public class FieldUtilsTest {
|
||||||
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
|
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
|
||||||
assertFalse(field.isAccessible());
|
assertFalse(field.isAccessible());
|
||||||
assertTrue(Modifier.isFinal(field.getModifiers()));
|
assertTrue(Modifier.isFinal(field.getModifiers()));
|
||||||
FieldUtils.removeFinalModifier(field);
|
callRemoveFinalModifierCheckForException(field, true);
|
||||||
// The field is no longer final
|
if (!SystemUtils.IS_JAVA_12 && !SystemUtils.IS_JAVA_13) {
|
||||||
assertFalse(Modifier.isFinal(field.getModifiers()));
|
assertFalse(Modifier.isFinal(field.getModifiers()));
|
||||||
assertFalse(field.isAccessible());
|
assertFalse(field.isAccessible());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1004,10 +1007,11 @@ public class FieldUtilsTest {
|
||||||
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
|
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
|
||||||
assertFalse(field.isAccessible());
|
assertFalse(field.isAccessible());
|
||||||
assertTrue(Modifier.isFinal(field.getModifiers()));
|
assertTrue(Modifier.isFinal(field.getModifiers()));
|
||||||
FieldUtils.removeFinalModifier(field, true);
|
callRemoveFinalModifierCheckForException(field, true);
|
||||||
// The field is no longer final
|
if (!SystemUtils.IS_JAVA_12 && !SystemUtils.IS_JAVA_13) {
|
||||||
assertFalse(Modifier.isFinal(field.getModifiers()));
|
assertFalse(Modifier.isFinal(field.getModifiers()));
|
||||||
assertFalse(field.isAccessible());
|
assertFalse(field.isAccessible());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1015,10 +1019,11 @@ public class FieldUtilsTest {
|
||||||
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
|
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
|
||||||
assertFalse(field.isAccessible());
|
assertFalse(field.isAccessible());
|
||||||
assertTrue(Modifier.isFinal(field.getModifiers()));
|
assertTrue(Modifier.isFinal(field.getModifiers()));
|
||||||
FieldUtils.removeFinalModifier(field, false);
|
callRemoveFinalModifierCheckForException(field, false);
|
||||||
// The field is STILL final because we did not force access
|
if (!SystemUtils.IS_JAVA_12 && !SystemUtils.IS_JAVA_13) {
|
||||||
assertTrue(Modifier.isFinal(field.getModifiers()));
|
assertTrue(Modifier.isFinal(field.getModifiers()));
|
||||||
assertFalse(field.isAccessible());
|
assertFalse(field.isAccessible());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1026,10 +1031,32 @@ public class FieldUtilsTest {
|
||||||
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE");
|
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE");
|
||||||
assertFalse(field.isAccessible());
|
assertFalse(field.isAccessible());
|
||||||
assertTrue(Modifier.isFinal(field.getModifiers()));
|
assertTrue(Modifier.isFinal(field.getModifiers()));
|
||||||
FieldUtils.removeFinalModifier(field, false);
|
callRemoveFinalModifierCheckForException(field, false);
|
||||||
// The field is no longer final AND we did not need to force access
|
if (!SystemUtils.IS_JAVA_12 && !SystemUtils.IS_JAVA_13) {
|
||||||
assertTrue(Modifier.isFinal(field.getModifiers()));
|
assertTrue(Modifier.isFinal(field.getModifiers()));
|
||||||
assertFalse(field.isAccessible());
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue