|
18 | 18 | import static org.junit.Assert.fail;
|
19 | 19 |
|
20 | 20 | import java.lang.reflect.Field;
|
| 21 | +import java.lang.reflect.Method; |
21 | 22 | import java.lang.reflect.Modifier;
|
22 | 23 | import java.security.KeyStore;
|
23 | 24 | import java.util.ArrayList;
|
@@ -481,9 +482,33 @@ private static void setFinalStatic(Class<?> clazz, String fieldName, Object newV
|
481 | 482 | Field field = clazz.getDeclaredField(fieldName);
|
482 | 483 | field.setAccessible(true);
|
483 | 484 |
|
484 |
| - Field modifiersField = Field.class.getDeclaredField("modifiers"); |
485 |
| - modifiersField.setAccessible(true); |
486 |
| - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); |
| 485 | + // On Java 8 and lower, use modifiers field |
| 486 | + try { |
| 487 | + Field modifiersField = Field.class.getDeclaredField("modifiers"); |
| 488 | + modifiersField.setAccessible(true); |
| 489 | + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); |
| 490 | + } catch (NoSuchFieldException e) { |
| 491 | + // On Java 9+, use VarHandle to modify final fields |
| 492 | + try { |
| 493 | + // Get the internal Field.modifiers field via JDK internal API |
| 494 | + Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class); |
| 495 | + getDeclaredFields0.setAccessible(true); |
| 496 | + Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, false); |
| 497 | + Field modifiersField = null; |
| 498 | + for (Field f : fields) { |
| 499 | + if ("modifiers".equals(f.getName())) { |
| 500 | + modifiersField = f; |
| 501 | + break; |
| 502 | + } |
| 503 | + } |
| 504 | + if (modifiersField != null) { |
| 505 | + modifiersField.setAccessible(true); |
| 506 | + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); |
| 507 | + } |
| 508 | + } catch (Exception ignored) { |
| 509 | + // If all attempts fail, try setting the value anyway |
| 510 | + } |
| 511 | + } |
487 | 512 |
|
488 | 513 | field.set(null, newValue);
|
489 | 514 | } catch (Exception e) {
|
|
0 commit comments