View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.lang3.reflect;
19  
20  import static org.apache.commons.lang3.LangAssertions.assertIllegalArgumentException;
21  import static org.apache.commons.lang3.LangAssertions.assertNullPointerException;
22  import static org.junit.jupiter.api.Assertions.assertArrayEquals;
23  import static org.junit.jupiter.api.Assertions.assertEquals;
24  import static org.junit.jupiter.api.Assertions.assertFalse;
25  import static org.junit.jupiter.api.Assertions.assertInstanceOf;
26  import static org.junit.jupiter.api.Assertions.assertNotNull;
27  import static org.junit.jupiter.api.Assertions.assertNull;
28  import static org.junit.jupiter.api.Assertions.assertThrows;
29  import static org.junit.jupiter.api.Assertions.assertTrue;
30  import static org.junit.jupiter.api.Assertions.fail;
31  import static org.junit.jupiter.api.Assumptions.assumeTrue;
32  
33  import java.lang.reflect.Constructor;
34  import java.lang.reflect.Field;
35  import java.lang.reflect.Modifier;
36  import java.util.ArrayList;
37  import java.util.Arrays;
38  import java.util.HashSet;
39  import java.util.List;
40  
41  import org.apache.commons.lang3.AbstractLangTest;
42  import org.apache.commons.lang3.ArraySorter;
43  import org.apache.commons.lang3.ArrayUtils;
44  import org.apache.commons.lang3.JavaVersion;
45  import org.apache.commons.lang3.SystemUtils;
46  import org.apache.commons.lang3.compare.ObjectToStringComparator;
47  import org.apache.commons.lang3.reflect.testbed.Ambig;
48  import org.apache.commons.lang3.reflect.testbed.Annotated;
49  import org.apache.commons.lang3.reflect.testbed.AnotherParent;
50  import org.apache.commons.lang3.reflect.testbed.Foo;
51  import org.apache.commons.lang3.reflect.testbed.PrivatelyShadowedChild;
52  import org.apache.commons.lang3.reflect.testbed.PublicChild;
53  import org.apache.commons.lang3.reflect.testbed.PubliclyShadowedChild;
54  import org.apache.commons.lang3.reflect.testbed.StaticContainer;
55  import org.apache.commons.lang3.reflect.testbed.StaticContainerChild;
56  import org.junit.jupiter.api.BeforeEach;
57  import org.junit.jupiter.api.Test;
58  
59  /**
60   * Tests FieldUtils
61   */
62  class FieldUtilsTest extends AbstractLangTest {
63  
64      private static final String JACOCO_DATA_FIELD_NAME = "$jacocoData";
65      static final Integer I0 = Integer.valueOf(0);
66      static final Integer I1 = Integer.valueOf(1);
67      static final Double D0 = Double.valueOf(0.0);
68      static final Double D1 = Double.valueOf(1.0);
69      @Annotated
70      private PublicChild publicChild;
71      private PubliclyShadowedChild publiclyShadowedChild;
72      @Annotated
73      private PrivatelyShadowedChild privatelyShadowedChild;
74      private final Class<? super PublicChild> parentClass = PublicChild.class.getSuperclass();
75  
76      /**
77       * Reads the {@code @deprecated} notice on {@link FieldUtils#removeFinalModifier(Field, boolean)}.
78       *
79       * @param field       {@link Field} to be curried into {@link FieldUtils#removeFinalModifier(Field, boolean)}.
80       * @param forceAccess {@link Boolean} to be curried into {@link FieldUtils#removeFinalModifier(Field, boolean)}.
81       */
82      private void callRemoveFinalModifierCheckForException(final Field field, final Boolean forceAccess) {
83          try {
84              FieldUtils.removeFinalModifier(field, forceAccess);
85          } catch (final UnsupportedOperationException exception) {
86              if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_12)) {
87                  assertInstanceOf(NoSuchFieldException.class, exception.getCause());
88              } else {
89                  fail("No exception should be thrown for java prior to 12.0");
90              }
91          }
92      }
93  
94      @BeforeEach
95      public void setUp() {
96          StaticContainer.reset();
97          publicChild = new PublicChild();
98          publiclyShadowedChild = new PubliclyShadowedChild();
99          privatelyShadowedChild = new PrivatelyShadowedChild();
100     }
101 
102     private Field[] sort(final Field[] fields) {
103         // Field does not implement Comparable, so we use a KISS solution here.
104         return ArraySorter.sort(fields, ObjectToStringComparator.INSTANCE);
105     }
106 
107     @Test
108     void testAmbig() {
109         assertIllegalArgumentException(() -> FieldUtils.getField(Ambig.class, "VALUE"));
110     }
111 
112     @Test
113     void testConstructor() {
114         assertNotNull(new FieldUtils());
115         final Constructor<?>[] cons = FieldUtils.class.getDeclaredConstructors();
116         assertEquals(1, cons.length);
117         assertTrue(Modifier.isPublic(cons[0].getModifiers()));
118         assertTrue(Modifier.isPublic(FieldUtils.class.getModifiers()));
119         assertFalse(Modifier.isFinal(FieldUtils.class.getModifiers()));
120     }
121 
122     @Test
123     void testGetAllFieldListsNullPointerException() {
124         assertNullPointerException(() -> FieldUtils.getAllFieldsList(null));
125     }
126 
127     @Test
128     void testGetAllFields() {
129         assertArrayEquals(new Field[0], FieldUtils.getAllFields(Object.class));
130         final Field[] fieldsNumber = sort(Number.class.getDeclaredFields());
131         assertArrayEquals(fieldsNumber, sort(FieldUtils.getAllFields(Number.class)));
132         final Field[] fieldsInteger = Integer.class.getDeclaredFields();
133         assertArrayEquals(sort(ArrayUtils.addAll(fieldsInteger, fieldsNumber)), sort(FieldUtils.getAllFields(Integer.class)));
134         final Field[] allFields = FieldUtils.getAllFields(PublicChild.class);
135         // Under Jacoco,0.8.1 and Java 10, the field count is 7.
136         int expected = 5;
137         for (final Field field : allFields) {
138             if (field.getName().equals(JACOCO_DATA_FIELD_NAME)) {
139                 expected++;
140             }
141         }
142         assertEquals(expected, allFields.length, Arrays.toString(allFields));
143     }
144 
145     @Test
146     void testGetAllFieldsList() {
147         assertEquals(0, FieldUtils.getAllFieldsList(Object.class).size());
148         final List<Field> fieldsNumber = Arrays.asList(Number.class.getDeclaredFields());
149         assertEquals(fieldsNumber, FieldUtils.getAllFieldsList(Number.class));
150         final List<Field> fieldsInteger = Arrays.asList(Integer.class.getDeclaredFields());
151         final List<Field> allFieldsInteger = new ArrayList<>(fieldsInteger);
152         allFieldsInteger.addAll(fieldsNumber);
153         assertEquals(new HashSet<>(allFieldsInteger), new HashSet<>(FieldUtils.getAllFieldsList(Integer.class)));
154         final List<Field> allFields = FieldUtils.getAllFieldsList(PublicChild.class);
155         // Under Jacoco,0.8.1 and Java 10, the field count is 7.
156         int expected = 5;
157         for (final Field field : allFields) {
158             if (field.getName().equals(JACOCO_DATA_FIELD_NAME)) {
159                 expected++;
160             }
161         }
162         assertEquals(expected, allFields.size(), allFields.toString());
163     }
164 
165     @Test
166     void testGetAllFieldsNullPointerException() {
167         assertNullPointerException(() -> FieldUtils.getAllFields(null));
168     }
169 
170     @Test
171     void testGetDeclaredField() {
172         assertNull(FieldUtils.getDeclaredField(PublicChild.class, "VALUE"));
173         assertNull(FieldUtils.getDeclaredField(PublicChild.class, "s"));
174         assertNull(FieldUtils.getDeclaredField(PublicChild.class, "b"));
175         assertNull(FieldUtils.getDeclaredField(PublicChild.class, "i"));
176         assertNull(FieldUtils.getDeclaredField(PublicChild.class, "d"));
177         assertNull(FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "VALUE"));
178         assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "s").getDeclaringClass());
179         assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "b").getDeclaringClass());
180         assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "i").getDeclaringClass());
181         assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "d").getDeclaringClass());
182         assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "VALUE"));
183         assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "s"));
184         assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "b"));
185         assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "i"));
186         assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "d"));
187     }
188 
189     @Test
190     void testGetDeclaredFieldAccessIllegalArgumentException1() {
191         assertIllegalArgumentException(() -> FieldUtils.getDeclaredField(PublicChild.class, null));
192     }
193 
194     @Test
195     void testGetDeclaredFieldAccessIllegalArgumentException2() {
196         assertIllegalArgumentException(() -> FieldUtils.getDeclaredField(PublicChild.class, ""));
197     }
198 
199     @Test
200     void testGetDeclaredFieldAccessIllegalArgumentException3() {
201         assertIllegalArgumentException(() -> FieldUtils.getDeclaredField(PublicChild.class, " "));
202     }
203 
204     @Test
205     void testGetDeclaredFieldAccessNullPointerException() {
206         assertNullPointerException(() -> FieldUtils.getDeclaredField(null, "none"));
207     }
208 
209     @Test
210     void testGetDeclaredFieldForceAccess() {
211         assertEquals(PublicChild.class, FieldUtils.getDeclaredField(PublicChild.class, "VALUE", true).getDeclaringClass());
212         assertNull(FieldUtils.getDeclaredField(PublicChild.class, "s", true));
213         assertNull(FieldUtils.getDeclaredField(PublicChild.class, "b", true));
214         assertNull(FieldUtils.getDeclaredField(PublicChild.class, "i", true));
215         assertNull(FieldUtils.getDeclaredField(PublicChild.class, "d", true));
216         assertNull(FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "VALUE", true));
217         assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "s", true).getDeclaringClass());
218         assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "b", true).getDeclaringClass());
219         assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "i", true).getDeclaringClass());
220         assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "d", true).getDeclaringClass());
221         assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "VALUE", true));
222         assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "s", true).getDeclaringClass());
223         assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "b", true).getDeclaringClass());
224         assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "i", true).getDeclaringClass());
225         assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "d", true).getDeclaringClass());
226     }
227 
228     @Test
229     void testGetDeclaredFieldForceAccessIllegalArgumentException1() {
230         assertIllegalArgumentException(() -> FieldUtils.getDeclaredField(PublicChild.class, null, true));
231     }
232 
233     @Test
234     void testGetDeclaredFieldForceAccessIllegalArgumentException2() {
235         assertIllegalArgumentException(() -> FieldUtils.getDeclaredField(PublicChild.class, "", true));
236     }
237 
238     @Test
239     void testGetDeclaredFieldForceAccessIllegalArgumentException3() {
240         assertIllegalArgumentException(() -> FieldUtils.getDeclaredField(PublicChild.class, " ", true));
241     }
242 
243     @Test
244     void testGetDeclaredFieldForceAccessNullPointerException() {
245         assertNullPointerException(() -> FieldUtils.getDeclaredField(null, "none", true));
246     }
247 
248     @Test
249     void testGetField() {
250         assertEquals(Foo.class, FieldUtils.getField(PublicChild.class, "VALUE").getDeclaringClass());
251         assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "s").getDeclaringClass());
252         assertNull(FieldUtils.getField(PublicChild.class, "b"));
253         assertNull(FieldUtils.getField(PublicChild.class, "i"));
254         assertNull(FieldUtils.getField(PublicChild.class, "d"));
255         assertEquals(Foo.class, FieldUtils.getField(PubliclyShadowedChild.class, "VALUE").getDeclaringClass());
256         assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "s").getDeclaringClass());
257         assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "b").getDeclaringClass());
258         assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "i").getDeclaringClass());
259         assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "d").getDeclaringClass());
260         assertEquals(Foo.class, FieldUtils.getField(PrivatelyShadowedChild.class, "VALUE").getDeclaringClass());
261         assertEquals(parentClass, FieldUtils.getField(PrivatelyShadowedChild.class, "s").getDeclaringClass());
262         assertNull(FieldUtils.getField(PrivatelyShadowedChild.class, "b"));
263         assertNull(FieldUtils.getField(PrivatelyShadowedChild.class, "i"));
264         assertNull(FieldUtils.getField(PrivatelyShadowedChild.class, "d"));
265     }
266 
267     @Test
268     void testGetFieldForceAccess() {
269         assertEquals(PublicChild.class, FieldUtils.getField(PublicChild.class, "VALUE", true).getDeclaringClass());
270         assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "s", true).getDeclaringClass());
271         assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "b", true).getDeclaringClass());
272         assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "i", true).getDeclaringClass());
273         assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "d", true).getDeclaringClass());
274         assertEquals(Foo.class, FieldUtils.getField(PubliclyShadowedChild.class, "VALUE", true).getDeclaringClass());
275         assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "s", true).getDeclaringClass());
276         assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "b", true).getDeclaringClass());
277         assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "i", true).getDeclaringClass());
278         assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "d", true).getDeclaringClass());
279         assertEquals(Foo.class, FieldUtils.getField(PrivatelyShadowedChild.class, "VALUE", true).getDeclaringClass());
280         assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "s", true).getDeclaringClass());
281         assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "b", true).getDeclaringClass());
282         assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "i", true).getDeclaringClass());
283         assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "d", true).getDeclaringClass());
284     }
285 
286     @Test
287     void testGetFieldForceAccessIllegalArgumentException1() {
288         assertIllegalArgumentException(() -> FieldUtils.getField(PublicChild.class, null, true));
289     }
290 
291     @Test
292     void testGetFieldForceAccessIllegalArgumentException2() {
293         assertIllegalArgumentException(() -> FieldUtils.getField(PublicChild.class, "", true));
294     }
295 
296     @Test
297     void testGetFieldForceAccessIllegalArgumentException3() {
298         assertIllegalArgumentException(() -> FieldUtils.getField(PublicChild.class, " ", true));
299     }
300 
301     @Test
302     void testGetFieldForceAccessNullPointerException() {
303         assertNullPointerException(() -> FieldUtils.getField(null, "none", true));
304     }
305 
306     @Test
307     void testGetFieldIllegalArgumentException1() {
308         assertIllegalArgumentException(() -> FieldUtils.getField(PublicChild.class, null));
309     }
310 
311     @Test
312     void testGetFieldIllegalArgumentException2() {
313         assertIllegalArgumentException(() -> FieldUtils.getField(PublicChild.class, ""));
314     }
315 
316     @Test
317     void testGetFieldIllegalArgumentException3() {
318         assertIllegalArgumentException(() -> FieldUtils.getField(PublicChild.class, " "));
319     }
320 
321     @Test
322     void testGetFieldNullPointerException() {
323         assertNullPointerException(() -> FieldUtils.getField(null, "none"));
324     }
325 
326     @Test
327     void testGetFieldsListWithAnnotation() throws NoSuchFieldException {
328         assertEquals(0, FieldUtils.getFieldsListWithAnnotation(Object.class, Annotated.class).size());
329         final List<Field> annotatedFields = Arrays.asList(FieldUtilsTest.class.getDeclaredField("publicChild"),
330                 FieldUtilsTest.class.getDeclaredField("privatelyShadowedChild"));
331         final List<Field> fieldUtilsTestAnnotatedFields = FieldUtils.getFieldsListWithAnnotation(FieldUtilsTest.class, Annotated.class);
332         assertEquals(annotatedFields.size(), fieldUtilsTestAnnotatedFields.size());
333         assertTrue(fieldUtilsTestAnnotatedFields.contains(annotatedFields.get(0)));
334         assertTrue(fieldUtilsTestAnnotatedFields.contains(annotatedFields.get(1)));
335     }
336 
337     @Test
338     void testGetFieldsListWithAnnotationNullPointerException() {
339         assertNullPointerException(() -> FieldUtils.getFieldsListWithAnnotation(FieldUtilsTest.class, null));
340     }
341 
342     @Test
343     void testGetFieldsListWithAnnotationNullPointerException2() {
344         assertNullPointerException(() -> FieldUtils.getFieldsListWithAnnotation(null, Annotated.class));
345     }
346 
347     @Test
348     void testGetFieldsListWithAnnotationNullPointerException3() {
349         assertNullPointerException(() -> FieldUtils.getFieldsListWithAnnotation(null, null));
350     }
351 
352     @Test
353     void testGetFieldsWithAnnotation() throws NoSuchFieldException {
354         assertArrayEquals(new Field[0], FieldUtils.getFieldsWithAnnotation(Object.class, Annotated.class));
355         final Field[] annotatedFields = sort(
356                 new Field[] { FieldUtilsTest.class.getDeclaredField("publicChild"), FieldUtilsTest.class.getDeclaredField("privatelyShadowedChild") });
357         assertArrayEquals(annotatedFields, sort(FieldUtils.getFieldsWithAnnotation(FieldUtilsTest.class, Annotated.class)));
358     }
359 
360     @Test
361     void testGetFieldsWithAnnotationNullPointerException1() {
362         assertNullPointerException(() -> FieldUtils.getFieldsWithAnnotation(FieldUtilsTest.class, null));
363     }
364 
365     @Test
366     void testGetFieldsWithAnnotationNullPointerException2() {
367         assertNullPointerException(() -> FieldUtils.getFieldsWithAnnotation(null, Annotated.class));
368     }
369 
370     @Test
371     void testGetFieldsWithAnnotationNullPointerException3() {
372         assertNullPointerException(() -> FieldUtils.getFieldsWithAnnotation(null, null));
373     }
374 
375     @Test
376     void testReadDeclaredNamedField() throws Exception {
377         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, null),
378                 "a null field name should cause an IllegalArgumentException");
379         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, ""),
380                 "an empty field name should cause an IllegalArgumentException");
381         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, " "),
382                 "a blank field name should cause an IllegalArgumentException");
383         assertNullPointerException(() -> FieldUtils.readDeclaredField(null, "none"), "a null target should cause an NullPointerException");
384         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, "s"));
385         assertEquals("ss", FieldUtils.readDeclaredField(publiclyShadowedChild, "s"));
386         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(privatelyShadowedChild, "s"));
387         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, "b"));
388         assertEquals(Boolean.TRUE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b"));
389         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(privatelyShadowedChild, "b"));
390         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, "i"));
391         assertEquals(I1, FieldUtils.readDeclaredField(publiclyShadowedChild, "i"));
392         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(privatelyShadowedChild, "i"));
393         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, "d"));
394         assertEquals(D1, FieldUtils.readDeclaredField(publiclyShadowedChild, "d"));
395         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(privatelyShadowedChild, "d"));
396     }
397 
398     @Test
399     void testReadDeclaredNamedFieldForceAccess() throws Exception {
400         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, null, true),
401                 "a null field name should cause an IllegalArgumentException");
402         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, "", true),
403                 "an empty field name should cause an IllegalArgumentException");
404         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, " ", true),
405                 "a blank field name should cause an IllegalArgumentException");
406         assertNullPointerException(() -> FieldUtils.readDeclaredField(null, "none", true), "a null target should cause an NullPointerException");
407         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, "s", true));
408         assertEquals("ss", FieldUtils.readDeclaredField(publiclyShadowedChild, "s", true));
409         assertEquals("ss", FieldUtils.readDeclaredField(privatelyShadowedChild, "s", true));
410         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, "b", true));
411         assertEquals(Boolean.TRUE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b", true));
412         assertEquals(Boolean.TRUE, FieldUtils.readDeclaredField(privatelyShadowedChild, "b", true));
413         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, "i", true));
414         assertEquals(I1, FieldUtils.readDeclaredField(publiclyShadowedChild, "i", true));
415         assertEquals(I1, FieldUtils.readDeclaredField(privatelyShadowedChild, "i", true));
416         assertIllegalArgumentException(() -> FieldUtils.readDeclaredField(publicChild, "d", true));
417         assertEquals(D1, FieldUtils.readDeclaredField(publiclyShadowedChild, "d", true));
418         assertEquals(D1, FieldUtils.readDeclaredField(privatelyShadowedChild, "d", true));
419     }
420 
421     @Test
422     void testReadDeclaredNamedStaticField() throws Exception {
423         assertNullPointerException(() -> FieldUtils.readDeclaredStaticField(AnotherParent.class, "doesNotExist"));
424         assertEquals(Foo.VALUE, FieldUtils.readDeclaredStaticField(Foo.class, "VALUE"));
425         assertNullPointerException(() -> FieldUtils.readDeclaredField(null, "VALUE"));
426         assertNullPointerException(() -> FieldUtils.readDeclaredStaticField(PublicChild.class, "VALUE"));
427         assertNullPointerException(() -> FieldUtils.readDeclaredStaticField(PubliclyShadowedChild.class, "VALUE"));
428         assertNullPointerException(() -> FieldUtils.readDeclaredStaticField(PrivatelyShadowedChild.class, "VALUE"));
429         assertIllegalArgumentException(() -> FieldUtils.readDeclaredStaticField(PublicChild.class, null));
430         assertIllegalArgumentException(() -> FieldUtils.readDeclaredStaticField(PublicChild.class, ""));
431         assertIllegalArgumentException(() -> FieldUtils.readDeclaredStaticField(PublicChild.class, " "));
432     }
433 
434     @Test
435     void testReadDeclaredNamedStaticFieldForceAccess() throws Exception {
436         assertEquals(Foo.VALUE, FieldUtils.readDeclaredStaticField(Foo.class, "VALUE", true));
437         assertEquals("child", FieldUtils.readDeclaredStaticField(PublicChild.class, "VALUE", true));
438         assertNullPointerException(() -> FieldUtils.readDeclaredStaticField(PubliclyShadowedChild.class, "VALUE", true));
439         assertNullPointerException(() -> FieldUtils.readDeclaredStaticField(PrivatelyShadowedChild.class, "VALUE", true));
440         assertIllegalArgumentException(() -> FieldUtils.readDeclaredStaticField(PrivatelyShadowedChild.class, null, true));
441         assertIllegalArgumentException(() -> FieldUtils.readDeclaredStaticField(PrivatelyShadowedChild.class, "", true));
442         assertIllegalArgumentException(() -> FieldUtils.readDeclaredStaticField(PrivatelyShadowedChild.class, " ", true));
443     }
444 
445     @Test
446     void testReadField() throws Exception {
447         final Field parentS = FieldUtils.getDeclaredField(parentClass, "s");
448         assertEquals("s", FieldUtils.readField(parentS, publicChild));
449         assertEquals("s", FieldUtils.readField(parentS, publiclyShadowedChild));
450         assertEquals("s", FieldUtils.readField(parentS, privatelyShadowedChild));
451         final Field parentB = FieldUtils.getDeclaredField(parentClass, "b", true);
452         assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publicChild));
453         assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publiclyShadowedChild));
454         assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, privatelyShadowedChild));
455         final Field parentI = FieldUtils.getDeclaredField(parentClass, "i", true);
456         assertEquals(I0, FieldUtils.readField(parentI, publicChild));
457         assertEquals(I0, FieldUtils.readField(parentI, publiclyShadowedChild));
458         assertEquals(I0, FieldUtils.readField(parentI, privatelyShadowedChild));
459         final Field parentD = FieldUtils.getDeclaredField(parentClass, "d", true);
460         assertEquals(D0, FieldUtils.readField(parentD, publicChild));
461         assertEquals(D0, FieldUtils.readField(parentD, publiclyShadowedChild));
462         assertEquals(D0, FieldUtils.readField(parentD, privatelyShadowedChild));
463         assertNullPointerException(() -> FieldUtils.readField(null, publicChild), "a null field should cause an NullPointerException");
464     }
465 
466     @Test
467     void testReadFieldForceAccess() throws Exception {
468         final Field parentS = FieldUtils.getDeclaredField(parentClass, "s");
469         parentS.setAccessible(false);
470         assertEquals("s", FieldUtils.readField(parentS, publicChild, true));
471         assertEquals("s", FieldUtils.readField(parentS, publiclyShadowedChild, true));
472         assertEquals("s", FieldUtils.readField(parentS, privatelyShadowedChild, true));
473         final Field parentB = FieldUtils.getDeclaredField(parentClass, "b", true);
474         parentB.setAccessible(false);
475         assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publicChild, true));
476         assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publiclyShadowedChild, true));
477         assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, privatelyShadowedChild, true));
478         final Field parentI = FieldUtils.getDeclaredField(parentClass, "i", true);
479         parentI.setAccessible(false);
480         assertEquals(I0, FieldUtils.readField(parentI, publicChild, true));
481         assertEquals(I0, FieldUtils.readField(parentI, publiclyShadowedChild, true));
482         assertEquals(I0, FieldUtils.readField(parentI, privatelyShadowedChild, true));
483         final Field parentD = FieldUtils.getDeclaredField(parentClass, "d", true);
484         parentD.setAccessible(false);
485         assertEquals(D0, FieldUtils.readField(parentD, publicChild, true));
486         assertEquals(D0, FieldUtils.readField(parentD, publiclyShadowedChild, true));
487         assertEquals(D0, FieldUtils.readField(parentD, privatelyShadowedChild, true));
488         assertNullPointerException(() -> FieldUtils.readField(null, publicChild, true), "a null field should cause an NullPointerException");
489     }
490 
491     @Test
492     void testReadNamedField() throws Exception {
493         assertEquals("s", FieldUtils.readField(publicChild, "s"));
494         assertEquals("ss", FieldUtils.readField(publiclyShadowedChild, "s"));
495         assertEquals("s", FieldUtils.readField(privatelyShadowedChild, "s"));
496         assertIllegalArgumentException(() -> FieldUtils.readField(publicChild, null),
497                 "a null field name should cause an IllegalArgumentException");
498         assertIllegalArgumentException(() -> FieldUtils.readField(publicChild, ""),
499                 "an empty field name should cause an IllegalArgumentException");
500         assertIllegalArgumentException(() -> FieldUtils.readField(publicChild, " "),
501                 "a blank field name should cause an IllegalArgumentException");
502         assertNullPointerException(() -> FieldUtils.readField((Object) null, "none"), "a null target should cause an NullPointerException");
503         assertIllegalArgumentException(() -> FieldUtils.readField(publicChild, "b"));
504         assertEquals(Boolean.TRUE, FieldUtils.readField(publiclyShadowedChild, "b"));
505         assertIllegalArgumentException(() -> FieldUtils.readField(privatelyShadowedChild, "b"));
506         assertIllegalArgumentException(() -> FieldUtils.readField(publicChild, "i"));
507         assertEquals(I1, FieldUtils.readField(publiclyShadowedChild, "i"));
508         assertIllegalArgumentException(() -> FieldUtils.readField(privatelyShadowedChild, "i"));
509         assertIllegalArgumentException(() -> FieldUtils.readField(publicChild, "d"));
510         assertEquals(D1, FieldUtils.readField(publiclyShadowedChild, "d"));
511         assertIllegalArgumentException(() -> FieldUtils.readField(privatelyShadowedChild, "d"));
512     }
513 
514     @Test
515     void testReadNamedFieldForceAccess() throws Exception {
516         assertEquals("s", FieldUtils.readField(publicChild, "s", true));
517         assertEquals("ss", FieldUtils.readField(publiclyShadowedChild, "s", true));
518         assertEquals("ss", FieldUtils.readField(privatelyShadowedChild, "s", true));
519         assertEquals(Boolean.FALSE, FieldUtils.readField(publicChild, "b", true));
520         assertEquals(Boolean.TRUE, FieldUtils.readField(publiclyShadowedChild, "b", true));
521         assertEquals(Boolean.TRUE, FieldUtils.readField(privatelyShadowedChild, "b", true));
522         assertEquals(I0, FieldUtils.readField(publicChild, "i", true));
523         assertEquals(I1, FieldUtils.readField(publiclyShadowedChild, "i", true));
524         assertEquals(I1, FieldUtils.readField(privatelyShadowedChild, "i", true));
525         assertEquals(D0, FieldUtils.readField(publicChild, "d", true));
526         assertEquals(D1, FieldUtils.readField(publiclyShadowedChild, "d", true));
527         assertEquals(D1, FieldUtils.readField(privatelyShadowedChild, "d", true));
528         assertIllegalArgumentException(() -> FieldUtils.readField(publicChild, null, true),
529                 "a null field name should cause an IllegalArgumentException");
530         assertIllegalArgumentException(() -> FieldUtils.readField(publicChild, "", true),
531                 "an empty field name should cause an IllegalArgumentException");
532         assertIllegalArgumentException(() -> FieldUtils.readField(publicChild, " ", true),
533                 "a blank field name should cause an IllegalArgumentException");
534         assertNullPointerException(() -> FieldUtils.readField((Object) null, "none", true), "a null target should cause an NullPointerException");
535     }
536 
537     @Test
538     void testReadNamedStaticField() throws Exception {
539         assertEquals(Foo.VALUE, FieldUtils.readStaticField(Foo.class, "VALUE"));
540         assertEquals(Foo.VALUE, FieldUtils.readStaticField(PubliclyShadowedChild.class, "VALUE"));
541         assertEquals(Foo.VALUE, FieldUtils.readStaticField(PrivatelyShadowedChild.class, "VALUE"));
542         assertEquals(Foo.VALUE, FieldUtils.readStaticField(PublicChild.class, "VALUE"));
543         assertNullPointerException(() -> FieldUtils.readStaticField(null, "none"), "null class should cause an NullPointerException");
544         assertIllegalArgumentException(() -> FieldUtils.readStaticField(Foo.class, null),
545                 "null field name should cause an IllegalArgumentException");
546         assertIllegalArgumentException(() -> FieldUtils.readStaticField(Foo.class, ""),
547                 "empty field name should cause an IllegalArgumentException");
548         assertIllegalArgumentException(() -> FieldUtils.readStaticField(Foo.class, " "),
549                 "blank field name should cause an IllegalArgumentException");
550         assertNullPointerException(() -> FieldUtils.readStaticField(Foo.class, "does_not_exist"),
551                 "a field that doesn't exist should cause an NullPointerException");
552         assertIllegalArgumentException(() -> FieldUtils.readStaticField(PublicChild.class, "s"),
553                 "non-static field should cause an IllegalArgumentException");
554     }
555 
556     @Test
557     void testReadNamedStaticFieldForceAccess() throws Exception {
558         assertEquals(Foo.VALUE, FieldUtils.readStaticField(Foo.class, "VALUE", true));
559         assertEquals(Foo.VALUE, FieldUtils.readStaticField(PubliclyShadowedChild.class, "VALUE", true));
560         assertEquals(Foo.VALUE, FieldUtils.readStaticField(PrivatelyShadowedChild.class, "VALUE", true));
561         assertEquals("child", FieldUtils.readStaticField(PublicChild.class, "VALUE", true));
562         assertNullPointerException(() -> FieldUtils.readStaticField(null, "none", true), "null class should cause an NullPointerException");
563         assertIllegalArgumentException(() -> FieldUtils.readStaticField(Foo.class, null, true),
564                 "null field name should cause an IllegalArgumentException");
565         assertIllegalArgumentException(() -> FieldUtils.readStaticField(Foo.class, "", true),
566                 "empty field name should cause an IllegalArgumentException");
567         assertIllegalArgumentException(() -> FieldUtils.readStaticField(Foo.class, " ", true),
568                 "blank field name should cause an IllegalArgumentException");
569         assertNullPointerException(() -> FieldUtils.readStaticField(Foo.class, "does_not_exist", true),
570                 "a field that doesn't exist should cause an NullPointerException");
571         assertIllegalArgumentException(() -> FieldUtils.readStaticField(PublicChild.class, "s", false),
572                 "non-static field should cause an IllegalArgumentException");
573     }
574 
575     @Test
576     void testReadStaticField() throws Exception {
577         assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(Foo.class, "VALUE")));
578     }
579 
580     @Test
581     void testReadStaticFieldForceAccess() throws Exception {
582         assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(Foo.class, "VALUE")));
583         assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(PublicChild.class, "VALUE")));
584     }
585 
586     @Test
587     void testReadStaticFieldForceAccessIllegalArgumentException() {
588         final Field nonStaticField = FieldUtils.getField(PublicChild.class, "s", true);
589         assumeTrue(nonStaticField != null);
590         assertIllegalArgumentException(() -> FieldUtils.readStaticField(nonStaticField, true));
591     }
592 
593     @Test
594     void testReadStaticFieldForceAccessNullPointerException() {
595         assertNullPointerException(() -> FieldUtils.readStaticField(null, true));
596     }
597 
598     @Test
599     void testReadStaticFieldIllegalArgumentException() throws Exception {
600         assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(Foo.class, "VALUE")));
601         final Field nonStaticField = FieldUtils.getField(PublicChild.class, "s");
602         assumeTrue(nonStaticField != null);
603         assertIllegalArgumentException(() -> FieldUtils.readStaticField(nonStaticField));
604     }
605 
606     @Test
607     void testReadStaticFieldNullPointerException() {
608         assertNullPointerException(() -> FieldUtils.readStaticField(null));
609     }
610 
611     @Test
612     void testRemoveFinalModifier() throws Exception {
613         final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
614         assertFalse(field.isAccessible());
615         assertTrue(Modifier.isFinal(field.getModifiers()));
616         callRemoveFinalModifierCheckForException(field, true);
617         if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_11)) {
618             assertFalse(Modifier.isFinal(field.getModifiers()));
619             assertFalse(field.isAccessible());
620         }
621     }
622 
623     @Test
624     void testRemoveFinalModifierAccessNotNeeded() throws Exception {
625         final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE");
626         assertFalse(field.isAccessible());
627         assertTrue(Modifier.isFinal(field.getModifiers()));
628         callRemoveFinalModifierCheckForException(field, false);
629         if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_11)) {
630             assertTrue(Modifier.isFinal(field.getModifiers()));
631             assertFalse(field.isAccessible());
632         }
633     }
634 
635     @Test
636     void testRemoveFinalModifierNullPointerException() {
637         assertNullPointerException(() -> FieldUtils.removeFinalModifier(null));
638     }
639 
640     @Test
641     void testRemoveFinalModifierWithAccess() throws Exception {
642         final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
643         assertFalse(field.isAccessible());
644         assertTrue(Modifier.isFinal(field.getModifiers()));
645         callRemoveFinalModifierCheckForException(field, true);
646         if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_11)) {
647             assertFalse(Modifier.isFinal(field.getModifiers()));
648             assertFalse(field.isAccessible());
649         }
650     }
651 
652     @Test
653     void testRemoveFinalModifierWithAccessNullPointerException() {
654         assertNullPointerException(() -> FieldUtils.removeFinalModifier(null, true));
655     }
656 
657     @Test
658     void testRemoveFinalModifierWithoutAccess() throws Exception {
659         final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
660         assertFalse(field.isAccessible());
661         assertTrue(Modifier.isFinal(field.getModifiers()));
662         callRemoveFinalModifierCheckForException(field, false);
663         if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_11)) {
664             assertTrue(Modifier.isFinal(field.getModifiers()));
665             assertFalse(field.isAccessible());
666         }
667     }
668 
669     @Test
670     void testWriteDeclaredNamedField() throws Exception {
671         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "s", "S"));
672         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "b", Boolean.TRUE));
673         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "i", Integer.valueOf(1)));
674         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "d", Double.valueOf(1.0)));
675         FieldUtils.writeDeclaredField(publiclyShadowedChild, "s", "S");
676         assertEquals("S", FieldUtils.readDeclaredField(publiclyShadowedChild, "s"));
677         FieldUtils.writeDeclaredField(publiclyShadowedChild, "b", Boolean.FALSE);
678         assertEquals(Boolean.FALSE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b"));
679         FieldUtils.writeDeclaredField(publiclyShadowedChild, "i", Integer.valueOf(0));
680         assertEquals(Integer.valueOf(0), FieldUtils.readDeclaredField(publiclyShadowedChild, "i"));
681         FieldUtils.writeDeclaredField(publiclyShadowedChild, "d", Double.valueOf(0.0));
682         assertEquals(Double.valueOf(0.0), FieldUtils.readDeclaredField(publiclyShadowedChild, "d"));
683         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(privatelyShadowedChild, "s", "S"));
684         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(privatelyShadowedChild, "b", Boolean.TRUE));
685         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(privatelyShadowedChild, "i", Integer.valueOf(1)));
686         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(privatelyShadowedChild, "d", Double.valueOf(1.0)));
687         assertNullPointerException(() -> FieldUtils.writeDeclaredField(null, "s", "S"));
688         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "null", "S"));
689         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "", "S"));
690         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, " ", "S"));
691     }
692 
693     @Test
694     void testWriteDeclaredNamedFieldForceAccess() throws Exception {
695         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "s", "S", true));
696         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "b", Boolean.TRUE, true));
697         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "i", Integer.valueOf(1), true));
698         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "d", Double.valueOf(1.0), true));
699         FieldUtils.writeDeclaredField(publiclyShadowedChild, "s", "S", true);
700         assertEquals("S", FieldUtils.readDeclaredField(publiclyShadowedChild, "s", true));
701         FieldUtils.writeDeclaredField(publiclyShadowedChild, "b", Boolean.FALSE, true);
702         assertEquals(Boolean.FALSE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b", true));
703         FieldUtils.writeDeclaredField(publiclyShadowedChild, "i", Integer.valueOf(0), true);
704         assertEquals(Integer.valueOf(0), FieldUtils.readDeclaredField(publiclyShadowedChild, "i", true));
705         FieldUtils.writeDeclaredField(publiclyShadowedChild, "d", Double.valueOf(0.0), true);
706         assertEquals(Double.valueOf(0.0), FieldUtils.readDeclaredField(publiclyShadowedChild, "d", true));
707         FieldUtils.writeDeclaredField(privatelyShadowedChild, "s", "S", true);
708         assertEquals("S", FieldUtils.readDeclaredField(privatelyShadowedChild, "s", true));
709         FieldUtils.writeDeclaredField(privatelyShadowedChild, "b", Boolean.FALSE, true);
710         assertEquals(Boolean.FALSE, FieldUtils.readDeclaredField(privatelyShadowedChild, "b", true));
711         FieldUtils.writeDeclaredField(privatelyShadowedChild, "i", Integer.valueOf(0), true);
712         assertEquals(Integer.valueOf(0), FieldUtils.readDeclaredField(privatelyShadowedChild, "i", true));
713         FieldUtils.writeDeclaredField(privatelyShadowedChild, "d", Double.valueOf(0.0), true);
714         assertEquals(Double.valueOf(0.0), FieldUtils.readDeclaredField(privatelyShadowedChild, "d", true));
715         assertNullPointerException(() -> FieldUtils.writeDeclaredField(null, "s", "S", true));
716         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "null", "S", true));
717         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, "", "S", true));
718         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredField(publicChild, " ", "S", true));
719     }
720 
721     @Test
722     void testWriteDeclaredNamedStaticField() throws Exception {
723         FieldUtils.writeStaticField(StaticContainer.class, "mutablePublic", "new");
724         assertEquals("new", StaticContainer.mutablePublic);
725         assertNullPointerException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutableProtected", "new"));
726         assertNullPointerException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePackage", "new"));
727         assertNullPointerException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePrivate", "new"));
728         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PUBLIC", "new"));
729         assertNullPointerException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PROTECTED", "new"));
730         assertNullPointerException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PACKAGE", "new"));
731         assertNullPointerException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PRIVATE", "new"));
732         assertNullPointerException(() -> FieldUtils.writeDeclaredStaticField(null, "mutablePublic", "new"));
733         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, null, "new"));
734         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "", "new"));
735         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, " ", "new"));
736     }
737 
738     @Test
739     void testWriteDeclaredNamedStaticFieldForceAccess() throws Exception {
740         FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePublic", "new", true);
741         assertEquals("new", StaticContainer.mutablePublic);
742         FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutableProtected", "new", true);
743         assertEquals("new", StaticContainer.getMutableProtected());
744         FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePackage", "new", true);
745         assertEquals("new", StaticContainer.getMutablePackage());
746         FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePrivate", "new", true);
747         assertEquals("new", StaticContainer.getMutablePrivate());
748         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PUBLIC", "new", true));
749         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PROTECTED", "new", true));
750         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PACKAGE", "new", true));
751         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PRIVATE", "new", true));
752         assertNullPointerException(() -> FieldUtils.writeDeclaredStaticField(null, "mutablePublic", "new", true));
753         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, null, "new", true));
754         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, "", "new", true));
755         assertIllegalArgumentException(() -> FieldUtils.writeDeclaredStaticField(StaticContainer.class, " ", "new", true));
756     }
757 
758     @Test
759     void testWriteField() throws Exception {
760         final Field field = parentClass.getDeclaredField("s");
761         FieldUtils.writeField(field, publicChild, "S");
762         assertEquals("S", field.get(publicChild));
763         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeField(parentClass.getDeclaredField("b"), publicChild, Boolean.TRUE));
764         assertThrows(IllegalAccessException.class,
765                 () -> FieldUtils.writeField(parentClass.getDeclaredField("i"), publicChild, Integer.valueOf(Integer.MAX_VALUE)));
766         assertThrows(IllegalAccessException.class,
767                 () -> FieldUtils.writeField(parentClass.getDeclaredField("d"), publicChild, Double.valueOf(Double.MAX_VALUE)));
768         assertNullPointerException(() -> FieldUtils.writeField(null, publicChild, "S"));
769     }
770 
771     @Test
772     void testWriteFieldForceAccess() throws Exception {
773         Field field = parentClass.getDeclaredField("s");
774         FieldUtils.writeField(field, publicChild, "S", true);
775         assertEquals("S", field.get(publicChild));
776         field = parentClass.getDeclaredField("b");
777         FieldUtils.writeField(field, publicChild, Boolean.TRUE, true);
778         assertEquals(Boolean.TRUE, field.get(publicChild));
779         field = parentClass.getDeclaredField("i");
780         FieldUtils.writeField(field, publicChild, Integer.valueOf(Integer.MAX_VALUE), true);
781         assertEquals(Integer.valueOf(Integer.MAX_VALUE), field.get(publicChild));
782         field = parentClass.getDeclaredField("d");
783         FieldUtils.writeField(field, publicChild, Double.valueOf(Double.MAX_VALUE), true);
784         assertEquals(Double.valueOf(Double.MAX_VALUE), field.get(publicChild));
785         assertNullPointerException(() -> FieldUtils.writeField(null, publicChild, "S", true));
786     }
787 
788     @Test
789     void testWriteNamedField() throws Exception {
790         FieldUtils.writeField(publicChild, "s", "S");
791         assertEquals("S", FieldUtils.readField(publicChild, "s"));
792         assertIllegalArgumentException(() -> FieldUtils.writeField(publicChild, "b", Boolean.TRUE));
793         assertIllegalArgumentException(() -> FieldUtils.writeField(publicChild, "i", Integer.valueOf(1)));
794         assertIllegalArgumentException(() -> FieldUtils.writeField(publicChild, "d", Double.valueOf(1.0)));
795         FieldUtils.writeField(publiclyShadowedChild, "s", "S");
796         assertEquals("S", FieldUtils.readField(publiclyShadowedChild, "s"));
797         FieldUtils.writeField(publiclyShadowedChild, "b", Boolean.FALSE);
798         assertEquals(Boolean.FALSE, FieldUtils.readField(publiclyShadowedChild, "b"));
799         FieldUtils.writeField(publiclyShadowedChild, "i", Integer.valueOf(0));
800         assertEquals(Integer.valueOf(0), FieldUtils.readField(publiclyShadowedChild, "i"));
801         FieldUtils.writeField(publiclyShadowedChild, "d", Double.valueOf(0.0));
802         assertEquals(Double.valueOf(0.0), FieldUtils.readField(publiclyShadowedChild, "d"));
803         FieldUtils.writeField(privatelyShadowedChild, "s", "S");
804         assertEquals("S", FieldUtils.readField(privatelyShadowedChild, "s"));
805         assertIllegalArgumentException(() -> FieldUtils.writeField(privatelyShadowedChild, "b", Boolean.TRUE));
806         assertIllegalArgumentException(() -> FieldUtils.writeField(privatelyShadowedChild, "i", Integer.valueOf(1)));
807         assertIllegalArgumentException(() -> FieldUtils.writeField(privatelyShadowedChild, "d", Double.valueOf(1.0)));
808         assertNullPointerException(() -> FieldUtils.writeField((Object) null, "s", "s"));
809         assertIllegalArgumentException(() -> FieldUtils.writeField(publicChild, null, "s"));
810         assertIllegalArgumentException(() -> FieldUtils.writeField(publicChild, "", "s"));
811         assertIllegalArgumentException(() -> FieldUtils.writeField(publicChild, " ", "s"));
812     }
813 
814     @Test
815     void testWriteNamedFieldForceAccess() throws Exception {
816         FieldUtils.writeField(publicChild, "s", "S", true);
817         assertEquals("S", FieldUtils.readField(publicChild, "s", true));
818         FieldUtils.writeField(publicChild, "b", Boolean.TRUE, true);
819         assertEquals(Boolean.TRUE, FieldUtils.readField(publicChild, "b", true));
820         FieldUtils.writeField(publicChild, "i", Integer.valueOf(1), true);
821         assertEquals(Integer.valueOf(1), FieldUtils.readField(publicChild, "i", true));
822         FieldUtils.writeField(publicChild, "d", Double.valueOf(1.0), true);
823         assertEquals(Double.valueOf(1.0), FieldUtils.readField(publicChild, "d", true));
824         FieldUtils.writeField(publiclyShadowedChild, "s", "S", true);
825         assertEquals("S", FieldUtils.readField(publiclyShadowedChild, "s", true));
826         FieldUtils.writeField(publiclyShadowedChild, "b", Boolean.FALSE, true);
827         assertEquals(Boolean.FALSE, FieldUtils.readField(publiclyShadowedChild, "b", true));
828         FieldUtils.writeField(publiclyShadowedChild, "i", Integer.valueOf(0), true);
829         assertEquals(Integer.valueOf(0), FieldUtils.readField(publiclyShadowedChild, "i", true));
830         FieldUtils.writeField(publiclyShadowedChild, "d", Double.valueOf(0.0), true);
831         assertEquals(Double.valueOf(0.0), FieldUtils.readField(publiclyShadowedChild, "d", true));
832         FieldUtils.writeField(privatelyShadowedChild, "s", "S", true);
833         assertEquals("S", FieldUtils.readField(privatelyShadowedChild, "s", true));
834         FieldUtils.writeField(privatelyShadowedChild, "b", Boolean.FALSE, true);
835         assertEquals(Boolean.FALSE, FieldUtils.readField(privatelyShadowedChild, "b", true));
836         FieldUtils.writeField(privatelyShadowedChild, "i", Integer.valueOf(0), true);
837         assertEquals(Integer.valueOf(0), FieldUtils.readField(privatelyShadowedChild, "i", true));
838         FieldUtils.writeField(privatelyShadowedChild, "d", Double.valueOf(0.0), true);
839         assertEquals(Double.valueOf(0.0), FieldUtils.readField(privatelyShadowedChild, "d", true));
840         assertNullPointerException(() -> FieldUtils.writeField((Object) null, "s", "s", true));
841         assertIllegalArgumentException(() -> FieldUtils.writeField(publicChild, null, "s", true));
842         assertIllegalArgumentException(() -> FieldUtils.writeField(publicChild, "", "s", true));
843         assertIllegalArgumentException(() -> FieldUtils.writeField(publicChild, " ", "s", true));
844     }
845 
846     @Test
847     void testWriteNamedStaticField() throws Exception {
848         FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePublic", "new");
849         assertEquals("new", StaticContainer.mutablePublic);
850         assertNullPointerException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, "mutableProtected", "new"));
851         assertNullPointerException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePackage", "new"));
852         assertNullPointerException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePrivate", "new"));
853         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PUBLIC", "new"));
854         assertNullPointerException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PROTECTED", "new"));
855         assertNullPointerException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PACKAGE", "new"));
856         assertNullPointerException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PRIVATE", "new"));
857         assertNullPointerException(() -> FieldUtils.writeStaticField(null, "IMMUTABLE_PRIVATE", "new"));
858         assertIllegalArgumentException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, null, "new"));
859         assertIllegalArgumentException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, "", "new"));
860         assertIllegalArgumentException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, " ", "new"));
861     }
862 
863     @Test
864     void testWriteNamedStaticFieldForceAccess() throws Exception {
865         FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePublic", "new", true);
866         assertEquals("new", StaticContainer.mutablePublic);
867         FieldUtils.writeStaticField(StaticContainerChild.class, "mutableProtected", "new", true);
868         assertEquals("new", StaticContainer.getMutableProtected());
869         FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePackage", "new", true);
870         assertEquals("new", StaticContainer.getMutablePackage());
871         FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePrivate", "new", true);
872         assertEquals("new", StaticContainer.getMutablePrivate());
873         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PUBLIC", "new", true));
874         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PROTECTED", "new", true));
875         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PACKAGE", "new", true));
876         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PRIVATE", "new", true));
877         assertNullPointerException(() -> FieldUtils.writeStaticField(null, "IMMUTABLE_PRIVATE", "new", true));
878         assertIllegalArgumentException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, null, "new", true));
879         assertIllegalArgumentException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, "", "new", true));
880         assertIllegalArgumentException(() -> FieldUtils.writeStaticField(StaticContainerChild.class, " ", "new", true));
881     }
882 
883     @Test
884     void testWriteStaticField() throws Exception {
885         final Field field = StaticContainer.class.getDeclaredField("mutablePublic");
886         FieldUtils.writeStaticField(field, "new");
887         assertEquals("new", StaticContainer.mutablePublic);
888         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("mutableProtected"), "new"));
889         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("mutablePackage"), "new"));
890         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("mutablePrivate"), "new"));
891         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PUBLIC"), "new"));
892         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PROTECTED"), "new"));
893         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE"), "new"));
894         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE"), "new"));
895         assertNullPointerException(() -> FieldUtils.writeStaticField(null, "new"));
896     }
897 
898     @Test
899     void testWriteStaticFieldForceAccess() throws Exception {
900         Field field = StaticContainer.class.getDeclaredField("mutablePublic");
901         FieldUtils.writeStaticField(field, "new", true);
902         assertEquals("new", StaticContainer.mutablePublic);
903         field = StaticContainer.class.getDeclaredField("mutableProtected");
904         FieldUtils.writeStaticField(field, "new", true);
905         assertEquals("new", StaticContainer.getMutableProtected());
906         field = StaticContainer.class.getDeclaredField("mutablePackage");
907         FieldUtils.writeStaticField(field, "new", true);
908         assertEquals("new", StaticContainer.getMutablePackage());
909         field = StaticContainer.class.getDeclaredField("mutablePrivate");
910         FieldUtils.writeStaticField(field, "new", true);
911         assertEquals("new", StaticContainer.getMutablePrivate());
912         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PUBLIC"), "new", true));
913         assertThrows(IllegalAccessException.class,
914                 () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PROTECTED"), "new", true));
915         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE"), "new", true));
916         assertThrows(IllegalAccessException.class, () -> FieldUtils.writeStaticField(StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE"), "new", true));
917         assertNullPointerException(() -> FieldUtils.writeStaticField(null, "new", true));
918     }
919 }