blob: 4e428a926b6ae453e6aeb130195145b1e8fe1439 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.lang3.reflect;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.JavaVersion;
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;
import org.apache.commons.lang3.reflect.testbed.PrivatelyShadowedChild;
import org.apache.commons.lang3.reflect.testbed.PublicChild;
import org.apache.commons.lang3.reflect.testbed.PubliclyShadowedChild;
import org.apache.commons.lang3.reflect.testbed.StaticContainer;
import org.apache.commons.lang3.reflect.testbed.StaticContainerChild;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
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;
/**
* Unit tests FieldUtils
*/
public class FieldUtilsTest {
private static final String JACOCO_DATA_FIELD_NAME = "$jacocoData";
static final Integer I0 = Integer.valueOf(0);
static final Integer I1 = Integer.valueOf(1);
static final Double D0 = Double.valueOf(0.0);
static final Double D1 = Double.valueOf(1.0);
@Annotated
private PublicChild publicChild;
private PubliclyShadowedChild publiclyShadowedChild;
@Annotated
private PrivatelyShadowedChild privatelyShadowedChild;
private final Class<? super PublicChild> parentClass = PublicChild.class.getSuperclass();
@BeforeEach
public void setUp() {
StaticContainer.reset();
publicChild = new PublicChild();
publiclyShadowedChild = new PubliclyShadowedChild();
privatelyShadowedChild = new PrivatelyShadowedChild();
}
@Test
public void testConstructor() {
assertNotNull(new FieldUtils());
final Constructor<?>[] cons = FieldUtils.class.getDeclaredConstructors();
assertEquals(1, cons.length);
assertTrue(Modifier.isPublic(cons[0].getModifiers()));
assertTrue(Modifier.isPublic(FieldUtils.class.getModifiers()));
assertFalse(Modifier.isFinal(FieldUtils.class.getModifiers()));
}
@Test
public void testGetField() {
assertEquals(Foo.class, FieldUtils.getField(PublicChild.class, "VALUE").getDeclaringClass());
assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "s").getDeclaringClass());
assertNull(FieldUtils.getField(PublicChild.class, "b"));
assertNull(FieldUtils.getField(PublicChild.class, "i"));
assertNull(FieldUtils.getField(PublicChild.class, "d"));
assertEquals(Foo.class, FieldUtils.getField(PubliclyShadowedChild.class, "VALUE").getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "s").getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "b").getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "i").getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "d").getDeclaringClass());
assertEquals(Foo.class, FieldUtils.getField(PrivatelyShadowedChild.class, "VALUE").getDeclaringClass());
assertEquals(parentClass, FieldUtils.getField(PrivatelyShadowedChild.class, "s").getDeclaringClass());
assertNull(FieldUtils.getField(PrivatelyShadowedChild.class, "b"));
assertNull(FieldUtils.getField(PrivatelyShadowedChild.class, "i"));
assertNull(FieldUtils.getField(PrivatelyShadowedChild.class, "d"));
}
@Test
public void testGetFieldIllegalArgumentException1() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getField(null, "none"));
}
@Test
public void testGetFieldIllegalArgumentException2() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getField(PublicChild.class, null));
}
@Test
public void testGetFieldIllegalArgumentException3() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getField(PublicChild.class, ""));
}
@Test
public void testGetFieldIllegalArgumentException4() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getField(PublicChild.class, " "));
}
@Test
public void testGetFieldForceAccess() {
assertEquals(PublicChild.class, FieldUtils.getField(PublicChild.class, "VALUE", true).getDeclaringClass());
assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "s", true).getDeclaringClass());
assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "b", true).getDeclaringClass());
assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "i", true).getDeclaringClass());
assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "d", true).getDeclaringClass());
assertEquals(Foo.class, FieldUtils.getField(PubliclyShadowedChild.class, "VALUE", true).getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "s", true).getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "b", true).getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "i", true).getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "d", true).getDeclaringClass());
assertEquals(Foo.class, FieldUtils.getField(PrivatelyShadowedChild.class, "VALUE", true).getDeclaringClass());
assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "s", true).getDeclaringClass());
assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "b", true).getDeclaringClass());
assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "i", true).getDeclaringClass());
assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "d", true).getDeclaringClass());
}
@Test
public void testGetFieldForceAccessIllegalArgumentException1() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getField(null, "none", true));
}
@Test
public void testGetFieldForceAccessIllegalArgumentException2() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getField(PublicChild.class, null, true));
}
@Test
public void testGetFieldForceAccessIllegalArgumentException3() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getField(PublicChild.class, "", true));
}
@Test
public void testGetFieldForceAccessIllegalArgumentException4() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getField(PublicChild.class, " ", true));
}
@Test
public void testGetAllFields() {
assertArrayEquals(new Field[0], FieldUtils.getAllFields(Object.class));
final Field[] fieldsNumber = Number.class.getDeclaredFields();
assertArrayEquals(fieldsNumber, FieldUtils.getAllFields(Number.class));
final Field[] fieldsInteger = Integer.class.getDeclaredFields();
assertArrayEquals(ArrayUtils.addAll(fieldsInteger, fieldsNumber), FieldUtils.getAllFields(Integer.class));
final Field[] allFields = FieldUtils.getAllFields(PublicChild.class);
// Under Jacoco,0.8.1 and Java 10, the field count is 7.
int expected = 5;
for (Field field : allFields) {
if (field.getName().equals(JACOCO_DATA_FIELD_NAME)) {
expected++;
}
}
assertEquals(expected, allFields.length, Arrays.toString(allFields));
}
@Test
public void testGetAllFieldsList() {
assertEquals(0, FieldUtils.getAllFieldsList(Object.class).size());
final List<Field> fieldsNumber = Arrays.asList(Number.class.getDeclaredFields());
assertEquals(fieldsNumber, FieldUtils.getAllFieldsList(Number.class));
final List<Field> fieldsInteger = Arrays.asList(Integer.class.getDeclaredFields());
final List<Field> allFieldsInteger = new ArrayList<>(fieldsInteger);
allFieldsInteger.addAll(fieldsNumber);
assertEquals(allFieldsInteger, FieldUtils.getAllFieldsList(Integer.class));
final List<Field> allFields = FieldUtils.getAllFieldsList(PublicChild.class);
// Under Jacoco,0.8.1 and Java 10, the field count is 7.
int expected = 5;
for (Field field : allFields) {
if (field.getName().equals(JACOCO_DATA_FIELD_NAME)) {
expected++;
}
}
assertEquals(expected, allFields.size(), allFields.toString());
}
@Test
public void testGetFieldsWithAnnotation() throws NoSuchFieldException {
assertArrayEquals(new Field[0], FieldUtils.getFieldsWithAnnotation(Object.class, Annotated.class));
final Field[] annotatedFields = new Field[]{
FieldUtilsTest.class.getDeclaredField("publicChild"),
FieldUtilsTest.class.getDeclaredField("privatelyShadowedChild")
};
assertArrayEquals(annotatedFields, FieldUtils.getFieldsWithAnnotation(FieldUtilsTest.class, Annotated.class));
}
@Test
public void testGetFieldsWithAnnotationIllegalArgumentException1() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getFieldsWithAnnotation(FieldUtilsTest.class, null));
}
@Test
public void testGetFieldsWithAnnotationIllegalArgumentException2() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getFieldsWithAnnotation(null, Annotated.class));
}
@Test
public void testGetFieldsWithAnnotationIllegalArgumentException3() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getFieldsWithAnnotation(null, null));
}
@Test
public void testGetFieldsListWithAnnotation() throws NoSuchFieldException {
assertEquals(0, FieldUtils.getFieldsListWithAnnotation(Object.class, Annotated.class).size());
final List<Field> annotatedFields = Arrays.asList(
FieldUtilsTest.class.getDeclaredField("publicChild"),
FieldUtilsTest.class.getDeclaredField("privatelyShadowedChild")
);
final List<Field> fieldUtilsTestAnnotatedFields = FieldUtils.getFieldsListWithAnnotation(FieldUtilsTest.class, Annotated.class);
assertEquals(annotatedFields.size(), fieldUtilsTestAnnotatedFields.size());
assertTrue(fieldUtilsTestAnnotatedFields.contains(annotatedFields.get(0)));
assertTrue(fieldUtilsTestAnnotatedFields.contains(annotatedFields.get(1)));
}
@Test
public void testGetFieldsListWithAnnotationIllegalArgumentException1() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getFieldsListWithAnnotation(FieldUtilsTest.class, null));
}
@Test
public void testGetFieldsListWithAnnotationIllegalArgumentException2() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getFieldsListWithAnnotation(null, Annotated.class));
}
@Test
public void testGetFieldsListWithAnnotationIllegalArgumentException3() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getFieldsListWithAnnotation(null, null));
}
@Test
public void testGetDeclaredField() {
assertNull(FieldUtils.getDeclaredField(PublicChild.class, "VALUE"));
assertNull(FieldUtils.getDeclaredField(PublicChild.class, "s"));
assertNull(FieldUtils.getDeclaredField(PublicChild.class, "b"));
assertNull(FieldUtils.getDeclaredField(PublicChild.class, "i"));
assertNull(FieldUtils.getDeclaredField(PublicChild.class, "d"));
assertNull(FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "VALUE"));
assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "s").getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "b").getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "i").getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "d").getDeclaringClass());
assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "VALUE"));
assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "s"));
assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "b"));
assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "i"));
assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "d"));
}
@Test
public void testGetDeclaredFieldAccessIllegalArgumentException1() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getDeclaredField(null, "none"));
}
@Test
public void testGetDeclaredFieldAccessIllegalArgumentException2() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getDeclaredField(PublicChild.class, null));
}
@Test
public void testGetDeclaredFieldAccessIllegalArgumentException3() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getDeclaredField(PublicChild.class, ""));
}
@Test
public void testGetDeclaredFieldAccessIllegalArgumentException4() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getDeclaredField(PublicChild.class, " "));
}
@Test
public void testGetDeclaredFieldForceAccess() {
assertEquals(PublicChild.class, FieldUtils.getDeclaredField(PublicChild.class, "VALUE", true).getDeclaringClass());
assertNull(FieldUtils.getDeclaredField(PublicChild.class, "s", true));
assertNull(FieldUtils.getDeclaredField(PublicChild.class, "b", true));
assertNull(FieldUtils.getDeclaredField(PublicChild.class, "i", true));
assertNull(FieldUtils.getDeclaredField(PublicChild.class, "d", true));
assertNull(FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "VALUE", true));
assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "s", true).getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "b", true).getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "i", true).getDeclaringClass());
assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "d", true).getDeclaringClass());
assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "VALUE", true));
assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "s", true).getDeclaringClass());
assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "b", true).getDeclaringClass());
assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "i", true).getDeclaringClass());
assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "d", true).getDeclaringClass());
}
@Test
public void testGetDeclaredFieldForceAccessIllegalArgumentException1() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getDeclaredField(null, "none", true));
}
@Test
public void testGetDeclaredFieldForceAccessIllegalArgumentException2() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getDeclaredField(PublicChild.class, null, true));
}
@Test
public void testGetDeclaredFieldForceAccessIllegalArgumentException3() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getDeclaredField(PublicChild.class, "", true));
}
@Test
public void testGetDeclaredFieldForceAccessIllegalArgumentException4() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getDeclaredField(PublicChild.class, " ", true));
}
@Test
public void testReadStaticField() throws Exception {
assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(Foo.class, "VALUE")));
}
@Test
public void testReadStaticFieldIllegalArgumentException1() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readStaticField(null));
}
@Test
public void testReadStaticFieldIllegalArgumentException2() throws Exception {
assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(Foo.class, "VALUE")));
final Field nonStaticField = FieldUtils.getField(PublicChild.class, "s");
assumeTrue(nonStaticField != null);
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readStaticField(nonStaticField));
}
@Test
public void testReadStaticFieldForceAccess() throws Exception {
assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(Foo.class, "VALUE")));
assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(PublicChild.class, "VALUE")));
}
@Test
public void testReadStaticFieldForceAccessIllegalArgumentException1() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readStaticField(null, true));
}
@Test
public void testReadStaticFieldForceAccessIllegalArgumentException2() {
final Field nonStaticField = FieldUtils.getField(PublicChild.class, "s", true);
assumeTrue(nonStaticField != null);
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readStaticField(nonStaticField));
}
@Test
public void testReadNamedStaticField() throws Exception {
assertEquals(Foo.VALUE, FieldUtils.readStaticField(Foo.class, "VALUE"));
assertEquals(Foo.VALUE, FieldUtils.readStaticField(PubliclyShadowedChild.class, "VALUE"));
assertEquals(Foo.VALUE, FieldUtils.readStaticField(PrivatelyShadowedChild.class, "VALUE"));
assertEquals(Foo.VALUE, FieldUtils.readStaticField(PublicChild.class, "VALUE"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(null, "none"),
"null class should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(Foo.class, null),
"null field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(Foo.class, ""),
"empty field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(Foo.class, " "),
"blank field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(Foo.class, "does_not_exist"),
"a field that doesn't exist should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(PublicChild.class, "s"),
"non-static field should cause an IllegalArgumentException");
}
@Test
public void testReadNamedStaticFieldForceAccess() throws Exception {
assertEquals(Foo.VALUE, FieldUtils.readStaticField(Foo.class, "VALUE", true));
assertEquals(Foo.VALUE, FieldUtils.readStaticField(PubliclyShadowedChild.class, "VALUE", true));
assertEquals(Foo.VALUE, FieldUtils.readStaticField(PrivatelyShadowedChild.class, "VALUE", true));
assertEquals("child", FieldUtils.readStaticField(PublicChild.class, "VALUE", true));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(null, "none", true),
"null class should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(Foo.class, null, true),
"null field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(Foo.class, "", true),
"empty field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(Foo.class, " ", true),
"blank field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(Foo.class, "does_not_exist", true),
"a field that doesn't exist should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readStaticField(PublicChild.class, "s", false),
"non-static field should cause an IllegalArgumentException");
}
@Test
public void testReadDeclaredNamedStaticField() throws Exception {
assertEquals(Foo.VALUE, FieldUtils.readDeclaredStaticField(Foo.class, "VALUE"));
assertThrows(
IllegalArgumentException.class, () -> FieldUtils.readDeclaredStaticField(PublicChild.class, "VALUE"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredStaticField(PubliclyShadowedChild.class, "VALUE"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredStaticField(PrivatelyShadowedChild.class, "VALUE"));
}
@Test
public void testReadDeclaredNamedStaticFieldForceAccess() throws Exception {
assertEquals(Foo.VALUE, FieldUtils.readDeclaredStaticField(Foo.class, "VALUE", true));
assertEquals("child", FieldUtils.readDeclaredStaticField(PublicChild.class, "VALUE", true));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredStaticField(PubliclyShadowedChild.class, "VALUE", true));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredStaticField(PrivatelyShadowedChild.class, "VALUE", true));
}
@Test
public void testReadField() throws Exception {
final Field parentS = FieldUtils.getDeclaredField(parentClass, "s");
assertEquals("s", FieldUtils.readField(parentS, publicChild));
assertEquals("s", FieldUtils.readField(parentS, publiclyShadowedChild));
assertEquals("s", FieldUtils.readField(parentS, privatelyShadowedChild));
final Field parentB = FieldUtils.getDeclaredField(parentClass, "b", true);
assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publicChild));
assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publiclyShadowedChild));
assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, privatelyShadowedChild));
final Field parentI = FieldUtils.getDeclaredField(parentClass, "i", true);
assertEquals(I0, FieldUtils.readField(parentI, publicChild));
assertEquals(I0, FieldUtils.readField(parentI, publiclyShadowedChild));
assertEquals(I0, FieldUtils.readField(parentI, privatelyShadowedChild));
final Field parentD = FieldUtils.getDeclaredField(parentClass, "d", true);
assertEquals(D0, FieldUtils.readField(parentD, publicChild));
assertEquals(D0, FieldUtils.readField(parentD, publiclyShadowedChild));
assertEquals(D0, FieldUtils.readField(parentD, privatelyShadowedChild));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField(null, publicChild),
"a null field should cause an IllegalArgumentException");
}
@Test
public void testReadFieldForceAccess() throws Exception {
final Field parentS = FieldUtils.getDeclaredField(parentClass, "s");
parentS.setAccessible(false);
assertEquals("s", FieldUtils.readField(parentS, publicChild, true));
assertEquals("s", FieldUtils.readField(parentS, publiclyShadowedChild, true));
assertEquals("s", FieldUtils.readField(parentS, privatelyShadowedChild, true));
final Field parentB = FieldUtils.getDeclaredField(parentClass, "b", true);
parentB.setAccessible(false);
assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publicChild, true));
assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publiclyShadowedChild, true));
assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, privatelyShadowedChild, true));
final Field parentI = FieldUtils.getDeclaredField(parentClass, "i", true);
parentI.setAccessible(false);
assertEquals(I0, FieldUtils.readField(parentI, publicChild, true));
assertEquals(I0, FieldUtils.readField(parentI, publiclyShadowedChild, true));
assertEquals(I0, FieldUtils.readField(parentI, privatelyShadowedChild, true));
final Field parentD = FieldUtils.getDeclaredField(parentClass, "d", true);
parentD.setAccessible(false);
assertEquals(D0, FieldUtils.readField(parentD, publicChild, true));
assertEquals(D0, FieldUtils.readField(parentD, publiclyShadowedChild, true));
assertEquals(D0, FieldUtils.readField(parentD, privatelyShadowedChild, true));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField(null, publicChild, true),
"a null field should cause an IllegalArgumentException");
}
@Test
public void testReadNamedField() throws Exception {
assertEquals("s", FieldUtils.readField(publicChild, "s"));
assertEquals("ss", FieldUtils.readField(publiclyShadowedChild, "s"));
assertEquals("s", FieldUtils.readField(privatelyShadowedChild, "s"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField(publicChild, null),
"a null field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField(publicChild, ""),
"an empty field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField(publicChild, " "),
"a blank field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField((Object) null, "none"),
"a null target should cause an IllegalArgumentException");
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readField(publicChild, "b"));
assertEquals(Boolean.TRUE, FieldUtils.readField(publiclyShadowedChild, "b"));
assertThrows( IllegalArgumentException.class, () -> FieldUtils.readField(privatelyShadowedChild, "b"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readField(publicChild, "i"));
assertEquals(I1, FieldUtils.readField(publiclyShadowedChild, "i"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readField(privatelyShadowedChild, "i"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readField(publicChild, "d"));
assertEquals(D1, FieldUtils.readField(publiclyShadowedChild, "d"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readField(privatelyShadowedChild, "d"));
}
@Test
public void testReadNamedFieldForceAccess() throws Exception {
assertEquals("s", FieldUtils.readField(publicChild, "s", true));
assertEquals("ss", FieldUtils.readField(publiclyShadowedChild, "s", true));
assertEquals("ss", FieldUtils.readField(privatelyShadowedChild, "s", true));
assertEquals(Boolean.FALSE, FieldUtils.readField(publicChild, "b", true));
assertEquals(Boolean.TRUE, FieldUtils.readField(publiclyShadowedChild, "b", true));
assertEquals(Boolean.TRUE, FieldUtils.readField(privatelyShadowedChild, "b", true));
assertEquals(I0, FieldUtils.readField(publicChild, "i", true));
assertEquals(I1, FieldUtils.readField(publiclyShadowedChild, "i", true));
assertEquals(I1, FieldUtils.readField(privatelyShadowedChild, "i", true));
assertEquals(D0, FieldUtils.readField(publicChild, "d", true));
assertEquals(D1, FieldUtils.readField(publiclyShadowedChild, "d", true));
assertEquals(D1, FieldUtils.readField(privatelyShadowedChild, "d", true));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField(publicChild, null, true),
"a null field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField(publicChild, "", true),
"an empty field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField(publicChild, " ", true),
"a blank field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readField((Object) null, "none", true),
"a null target should cause an IllegalArgumentException");
}
@Test
public void testReadDeclaredNamedField() throws Exception {
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredField(publicChild, null),
"a null field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredField(publicChild, ""),
"an empty field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredField(publicChild, " "),
"a blank field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredField(null, "none"),
"a null target should cause an IllegalArgumentException");
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(publicChild, "s"));
assertEquals("ss", FieldUtils.readDeclaredField(publiclyShadowedChild, "s"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(privatelyShadowedChild, "s"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(publicChild, "b"));
assertEquals(Boolean.TRUE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(privatelyShadowedChild, "b"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(publicChild, "i"));
assertEquals(I1, FieldUtils.readDeclaredField(publiclyShadowedChild, "i"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(privatelyShadowedChild, "i"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(publicChild, "d"));
assertEquals(D1, FieldUtils.readDeclaredField(publiclyShadowedChild, "d"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(privatelyShadowedChild, "d"));
}
@Test
public void testReadDeclaredNamedFieldForceAccess() throws Exception {
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredField(publicChild, null, true),
"a null field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredField(publicChild, "", true),
"an empty field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredField(publicChild, " ", true),
"a blank field name should cause an IllegalArgumentException");
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.readDeclaredField(null, "none", true),
"a null target should cause an IllegalArgumentException");
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(publicChild, "s", true));
assertEquals("ss", FieldUtils.readDeclaredField(publiclyShadowedChild, "s", true));
assertEquals("ss", FieldUtils.readDeclaredField(privatelyShadowedChild, "s", true));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(publicChild, "b", true));
assertEquals(Boolean.TRUE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b", true));
assertEquals(Boolean.TRUE, FieldUtils.readDeclaredField(privatelyShadowedChild, "b", true));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(publicChild, "i", true));
assertEquals(I1, FieldUtils.readDeclaredField(publiclyShadowedChild, "i", true));
assertEquals(I1, FieldUtils.readDeclaredField(privatelyShadowedChild, "i", true));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.readDeclaredField(publicChild, "d", true));
assertEquals(D1, FieldUtils.readDeclaredField(publiclyShadowedChild, "d", true));
assertEquals(D1, FieldUtils.readDeclaredField(privatelyShadowedChild, "d", true));
}
@Test
public void testWriteStaticField() throws Exception {
Field field = StaticContainer.class.getDeclaredField("mutablePublic");
FieldUtils.writeStaticField(field, "new");
assertEquals("new", StaticContainer.mutablePublic);
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("mutableProtected"), "new"));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("mutablePackage"), "new"));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("mutablePrivate"), "new"));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PUBLIC"), "new"));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PROTECTED"), "new"));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE"), "new"));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE"), "new"));
}
@Test
public void testWriteStaticFieldForceAccess() throws Exception {
Field field = StaticContainer.class.getDeclaredField("mutablePublic");
FieldUtils.writeStaticField(field, "new", true);
assertEquals("new", StaticContainer.mutablePublic);
field = StaticContainer.class.getDeclaredField("mutableProtected");
FieldUtils.writeStaticField(field, "new", true);
assertEquals("new", StaticContainer.getMutableProtected());
field = StaticContainer.class.getDeclaredField("mutablePackage");
FieldUtils.writeStaticField(field, "new", true);
assertEquals("new", StaticContainer.getMutablePackage());
field = StaticContainer.class.getDeclaredField("mutablePrivate");
FieldUtils.writeStaticField(field, "new", true);
assertEquals("new", StaticContainer.getMutablePrivate());
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PUBLIC"), "new", true));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PROTECTED"), "new", true));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE"), "new", true));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE"), "new", true));
}
@Test
public void testWriteNamedStaticField() throws Exception {
FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePublic", "new");
assertEquals("new", StaticContainer.mutablePublic);
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "mutableProtected", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePackage", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePrivate", "new"));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PUBLIC", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PROTECTED", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PACKAGE", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PRIVATE", "new"));
}
@Test
public void testWriteNamedStaticFieldForceAccess() throws Exception {
FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePublic", "new", true);
assertEquals("new", StaticContainer.mutablePublic);
FieldUtils.writeStaticField(StaticContainerChild.class, "mutableProtected", "new", true);
assertEquals("new", StaticContainer.getMutableProtected());
FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePackage", "new", true);
assertEquals("new", StaticContainer.getMutablePackage());
FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePrivate", "new", true);
assertEquals("new", StaticContainer.getMutablePrivate());
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PUBLIC", "new", true));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PROTECTED", "new", true));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PACKAGE", "new", true));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PRIVATE", "new", true));
}
@Test
public void testWriteDeclaredNamedStaticField() throws Exception {
FieldUtils.writeStaticField(StaticContainer.class, "mutablePublic", "new");
assertEquals("new", StaticContainer.mutablePublic);
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutableProtected", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePackage", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePrivate", "new"));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PUBLIC", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PROTECTED", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PACKAGE", "new"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PRIVATE", "new"));
}
@Test
public void testWriteDeclaredNamedStaticFieldForceAccess() throws Exception {
FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePublic", "new", true);
assertEquals("new", StaticContainer.mutablePublic);
FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutableProtected", "new", true);
assertEquals("new", StaticContainer.getMutableProtected());
FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePackage", "new", true);
assertEquals("new", StaticContainer.getMutablePackage());
FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePrivate", "new", true);
assertEquals("new", StaticContainer.getMutablePrivate());
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PUBLIC", "new", true));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PROTECTED", "new", true));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PACKAGE", "new", true));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PRIVATE", "new", true));
}
@Test
public void testWriteField() throws Exception {
Field field = parentClass.getDeclaredField("s");
FieldUtils.writeField(field, publicChild, "S");
assertEquals("S", field.get(publicChild));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeField(parentClass.getDeclaredField("b"), publicChild, Boolean.TRUE));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeField(parentClass.getDeclaredField("i"), publicChild, Integer.valueOf(Integer.MAX_VALUE)));
assertThrows(
IllegalAccessException.class,
() -> FieldUtils.writeField(parentClass.getDeclaredField("d"), publicChild, Double.valueOf(Double.MAX_VALUE)));
}
@Test
public void testWriteFieldForceAccess() throws Exception {
Field field = parentClass.getDeclaredField("s");
FieldUtils.writeField(field, publicChild, "S", true);
assertEquals("S", field.get(publicChild));
field = parentClass.getDeclaredField("b");
FieldUtils.writeField(field, publicChild, Boolean.TRUE, true);
assertEquals(Boolean.TRUE, field.get(publicChild));
field = parentClass.getDeclaredField("i");
FieldUtils.writeField(field, publicChild, Integer.valueOf(Integer.MAX_VALUE), true);
assertEquals(Integer.valueOf(Integer.MAX_VALUE), field.get(publicChild));
field = parentClass.getDeclaredField("d");
FieldUtils.writeField(field, publicChild, Double.valueOf(Double.MAX_VALUE), true);
assertEquals(Double.valueOf(Double.MAX_VALUE), field.get(publicChild));
}
@Test
public void testWriteNamedField() throws Exception {
FieldUtils.writeField(publicChild, "s", "S");
assertEquals("S", FieldUtils.readField(publicChild, "s"));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.writeField(publicChild, "b", Boolean.TRUE));
assertThrows(IllegalArgumentException.class, () -> FieldUtils.writeField(publicChild, "i", Integer.valueOf(1)));
assertThrows(
IllegalArgumentException.class, () -> FieldUtils.writeField(publicChild, "d", Double.valueOf(1.0)));
FieldUtils.writeField(publiclyShadowedChild, "s", "S");
assertEquals("S", FieldUtils.readField(publiclyShadowedChild, "s"));
FieldUtils.writeField(publiclyShadowedChild, "b", Boolean.FALSE);
assertEquals(Boolean.FALSE, FieldUtils.readField(publiclyShadowedChild, "b"));
FieldUtils.writeField(publiclyShadowedChild, "i", Integer.valueOf(0));
assertEquals(Integer.valueOf(0), FieldUtils.readField(publiclyShadowedChild, "i"));
FieldUtils.writeField(publiclyShadowedChild, "d", Double.valueOf(0.0));
assertEquals(Double.valueOf(0.0), FieldUtils.readField(publiclyShadowedChild, "d"));
FieldUtils.writeField(privatelyShadowedChild, "s", "S");
assertEquals("S", FieldUtils.readField(privatelyShadowedChild, "s"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeField(privatelyShadowedChild, "b", Boolean.TRUE));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeField(privatelyShadowedChild, "i", Integer.valueOf(1)));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeField(privatelyShadowedChild, "d", Double.valueOf(1.0)));
}
@Test
public void testWriteNamedFieldForceAccess() throws Exception {
FieldUtils.writeField(publicChild, "s", "S", true);
assertEquals("S", FieldUtils.readField(publicChild, "s", true));
FieldUtils.writeField(publicChild, "b", Boolean.TRUE, true);
assertEquals(Boolean.TRUE, FieldUtils.readField(publicChild, "b", true));
FieldUtils.writeField(publicChild, "i", Integer.valueOf(1), true);
assertEquals(Integer.valueOf(1), FieldUtils.readField(publicChild, "i", true));
FieldUtils.writeField(publicChild, "d", Double.valueOf(1.0), true);
assertEquals(Double.valueOf(1.0), FieldUtils.readField(publicChild, "d", true));
FieldUtils.writeField(publiclyShadowedChild, "s", "S", true);
assertEquals("S", FieldUtils.readField(publiclyShadowedChild, "s", true));
FieldUtils.writeField(publiclyShadowedChild, "b", Boolean.FALSE, true);
assertEquals(Boolean.FALSE, FieldUtils.readField(publiclyShadowedChild, "b", true));
FieldUtils.writeField(publiclyShadowedChild, "i", Integer.valueOf(0), true);
assertEquals(Integer.valueOf(0), FieldUtils.readField(publiclyShadowedChild, "i", true));
FieldUtils.writeField(publiclyShadowedChild, "d", Double.valueOf(0.0), true);
assertEquals(Double.valueOf(0.0), FieldUtils.readField(publiclyShadowedChild, "d", true));
FieldUtils.writeField(privatelyShadowedChild, "s", "S", true);
assertEquals("S", FieldUtils.readField(privatelyShadowedChild, "s", true));
FieldUtils.writeField(privatelyShadowedChild, "b", Boolean.FALSE, true);
assertEquals(Boolean.FALSE, FieldUtils.readField(privatelyShadowedChild, "b", true));
FieldUtils.writeField(privatelyShadowedChild, "i", Integer.valueOf(0), true);
assertEquals(Integer.valueOf(0), FieldUtils.readField(privatelyShadowedChild, "i", true));
FieldUtils.writeField(privatelyShadowedChild, "d", Double.valueOf(0.0), true);
assertEquals(Double.valueOf(0.0), FieldUtils.readField(privatelyShadowedChild, "d", true));
}
@Test
public void testWriteDeclaredNamedField() throws Exception {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.writeDeclaredField(publicChild, "s", "S"));
assertThrows(
IllegalArgumentException.class, () -> FieldUtils.writeDeclaredField(publicChild, "b", Boolean.TRUE));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredField(publicChild, "i", Integer.valueOf(1)));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredField(publicChild, "d", Double.valueOf(1.0)));
FieldUtils.writeDeclaredField(publiclyShadowedChild, "s", "S");
assertEquals("S", FieldUtils.readDeclaredField(publiclyShadowedChild, "s"));
FieldUtils.writeDeclaredField(publiclyShadowedChild, "b", Boolean.FALSE);
assertEquals(Boolean.FALSE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b"));
FieldUtils.writeDeclaredField(publiclyShadowedChild, "i", Integer.valueOf(0));
assertEquals(Integer.valueOf(0), FieldUtils.readDeclaredField(publiclyShadowedChild, "i"));
FieldUtils.writeDeclaredField(publiclyShadowedChild, "d", Double.valueOf(0.0));
assertEquals(Double.valueOf(0.0), FieldUtils.readDeclaredField(publiclyShadowedChild, "d"));
assertThrows(
IllegalArgumentException.class, () -> FieldUtils.writeDeclaredField(privatelyShadowedChild, "s", "S"));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredField(privatelyShadowedChild, "b", Boolean.TRUE));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredField(privatelyShadowedChild, "i", Integer.valueOf(1)));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredField(privatelyShadowedChild, "d", Double.valueOf(1.0)));
}
@Test
public void testWriteDeclaredNamedFieldForceAccess() throws Exception {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.writeDeclaredField(publicChild, "s", "S", true));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredField(publicChild, "b", Boolean.TRUE, true));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredField(publicChild, "i", Integer.valueOf(1), true));
assertThrows(
IllegalArgumentException.class,
() -> FieldUtils.writeDeclaredField(publicChild, "d", Double.valueOf(1.0), true));
FieldUtils.writeDeclaredField(publiclyShadowedChild, "s", "S", true);
assertEquals("S", FieldUtils.readDeclaredField(publiclyShadowedChild, "s", true));
FieldUtils.writeDeclaredField(publiclyShadowedChild, "b", Boolean.FALSE, true);
assertEquals(Boolean.FALSE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b", true));
FieldUtils.writeDeclaredField(publiclyShadowedChild, "i", Integer.valueOf(0), true);
assertEquals(Integer.valueOf(0), FieldUtils.readDeclaredField(publiclyShadowedChild, "i", true));
FieldUtils.writeDeclaredField(publiclyShadowedChild, "d", Double.valueOf(0.0), true);
assertEquals(Double.valueOf(0.0), FieldUtils.readDeclaredField(publiclyShadowedChild, "d", true));
FieldUtils.writeDeclaredField(privatelyShadowedChild, "s", "S", true);
assertEquals("S", FieldUtils.readDeclaredField(privatelyShadowedChild, "s", true));
FieldUtils.writeDeclaredField(privatelyShadowedChild, "b", Boolean.FALSE, true);
assertEquals(Boolean.FALSE, FieldUtils.readDeclaredField(privatelyShadowedChild, "b", true));
FieldUtils.writeDeclaredField(privatelyShadowedChild, "i", Integer.valueOf(0), true);
assertEquals(Integer.valueOf(0), FieldUtils.readDeclaredField(privatelyShadowedChild, "i", true));
FieldUtils.writeDeclaredField(privatelyShadowedChild, "d", Double.valueOf(0.0), true);
assertEquals(Double.valueOf(0.0), FieldUtils.readDeclaredField(privatelyShadowedChild, "d", true));
}
@Test
public void testAmbig() {
assertThrows(IllegalArgumentException.class, () -> FieldUtils.getField(Ambig.class, "VALUE"));
}
@Test
public void testRemoveFinalModifier() throws Exception {
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
assertFalse(field.isAccessible());
assertTrue(Modifier.isFinal(field.getModifiers()));
callRemoveFinalModifierCheckForException(field, true);
if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_11)) {
assertFalse(Modifier.isFinal(field.getModifiers()));
assertFalse(field.isAccessible());
}
}
@Test
public void testRemoveFinalModifierWithAccess() throws Exception {
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
assertFalse(field.isAccessible());
assertTrue(Modifier.isFinal(field.getModifiers()));
callRemoveFinalModifierCheckForException(field, true);
if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_11)) {
assertFalse(Modifier.isFinal(field.getModifiers()));
assertFalse(field.isAccessible());
}
}
@Test
public void testRemoveFinalModifierWithoutAccess() throws Exception {
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
assertFalse(field.isAccessible());
assertTrue(Modifier.isFinal(field.getModifiers()));
callRemoveFinalModifierCheckForException(field, false);
if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_11)) {
assertTrue(Modifier.isFinal(field.getModifiers()));
assertFalse(field.isAccessible());
}
}
@Test
public void testRemoveFinalModifierAccessNotNeeded() throws Exception {
final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE");
assertFalse(field.isAccessible());
assertTrue(Modifier.isFinal(field.getModifiers()));
callRemoveFinalModifierCheckForException(field, false);
if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_11)) {
assertTrue(Modifier.isFinal(field.getModifiers()));
assertFalse(field.isAccessible());
}
}
/**
* Read the {@code @deprecated} 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.isJavaVersionAtLeast(JavaVersion.JAVA_12)) {
assertTrue(exception.getCause() instanceof NoSuchFieldException);
} else {
fail("No exception should be thrown for java prior to 12.0");
}
}
}
}