1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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
78
79
80
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
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
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
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 }