From e2391713c2be0f714fddece51287247d0ab9f056 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Sun, 12 Feb 2023 09:47:32 +0100 Subject: [PATCH] Some more reflection fixes --- .../lib/internal/ReflectionUtil.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/falsepattern/lib/internal/ReflectionUtil.java b/src/main/java/com/falsepattern/lib/internal/ReflectionUtil.java index 89646b1..a9250a5 100644 --- a/src/main/java/com/falsepattern/lib/internal/ReflectionUtil.java +++ b/src/main/java/com/falsepattern/lib/internal/ReflectionUtil.java @@ -31,13 +31,37 @@ public class ReflectionUtil { static { try { - f_modifiers = Field.class.getDeclaredField("modifiers"); + f_modifiers = getModifiersField(); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } f_modifiers.setAccessible(true); } + // ref: https://github.com/prestodb/presto/pull/15240/files#diff-8bf996e5c1d4fb088b84ae0528bc42686b0724bcf5a2692a1e7b5eff32c90cce + private static Field getModifiersField() throws NoSuchFieldException + { + try { + return Field.class.getDeclaredField("modifiers"); + } + catch (NoSuchFieldException e) { + try { + Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class); + getDeclaredFields0.setAccessible(true); + Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, false); + for (Field field : fields) { + if ("modifiers".equals(field.getName())) { + return field; + } + } + } + catch (ReflectiveOperationException ex) { + e.addSuppressed(ex); + } + throw e; + } + } + @SneakyThrows public static void jailBreak(Field field) { field.setAccessible(true);