From c89a0d0a2384267af25a4afbbf222c848ab55efe Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Thu, 12 Mar 2015 21:09:04 -0700 Subject: [PATCH] fix for copy field problem in issue 98 --- .../main/java/org/springsource/loaded/jvm/JVM.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/springloaded/src/main/java/org/springsource/loaded/jvm/JVM.java b/springloaded/src/main/java/org/springsource/loaded/jvm/JVM.java index e96be04..b07985a 100644 --- a/springloaded/src/main/java/org/springsource/loaded/jvm/JVM.java +++ b/springloaded/src/main/java/org/springsource/loaded/jvm/JVM.java @@ -55,6 +55,7 @@ public class JVM { } } + private static Field jlrFieldRootField; private static Method jlrFieldCopy; static { try { @@ -63,6 +64,12 @@ public class JVM { } catch (Exception e) { log.log(Level.SEVERE, "Problems getting 'Field.copy()' method. Incompatible JVM?", e); } + try { + jlrFieldRootField = Field.class.getDeclaredField("root"); + jlrFieldRootField.setAccessible(true); + } catch (Exception e) { + // Possibly on a JDK level that didn't have this? + } } private static Method jlrConstructorGetRoot; @@ -162,6 +169,13 @@ public class JVM { public static Field copyField(Field field) { try { + if (jlrFieldRootField != null) { + jlrFieldRootField.setAccessible(true); + Field possibleRoot = (Field)jlrFieldRootField.get(field); + if (possibleRoot != null) { + field = possibleRoot; + } + } return (Field) jlrFieldCopy.invoke(field); } catch (Exception e) { log.log(Level.SEVERE, "Problems copying field. Incompatible JVM?", e);