From 59f52a9e35b34f03cac7dc27975eeb909e51411a Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Fri, 2 Jun 2017 13:55:43 +0200 Subject: [PATCH] DATACMNS-1079 - Disable generated property accessors if ClassLoader is encapsulated. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ClassGeneratingPropertyAccessorFactory does not work with Java 9 (encapsulated modules, without --permit-illegal-access), because making ClassLoader.defineClass accessible fails. Therefore this change moves call to setAccessible to the check that ensures availability of the method so isSupported(…) returns false. Original pull request: #224. --- .../ClassGeneratingPropertyAccessorFactory.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java b/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java index 863232b54..e5a9c8ae6 100644 --- a/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java +++ b/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java @@ -1463,7 +1463,6 @@ public class ClassGeneratingPropertyAccessorFactory implements PersistentPropert try { Method defineClass = getClassLoaderMethod(persistentEntity); - defineClass.setAccessible(true); return (Class) defineClass.invoke(classLoader, name, bytes, offset, len, persistentEntity.getClass().getProtectionDomain()); @@ -1478,8 +1477,19 @@ public class ClassGeneratingPropertyAccessorFactory implements PersistentPropert ClassLoader classLoader = entity.getType().getClassLoader(); Class classLoaderClass = classLoader.getClass(); - return ReflectionUtils.findMethod(classLoaderClass, "defineClass", String.class, byte[].class, Integer.TYPE, - Integer.TYPE, ProtectionDomain.class); + Method defineClass = ReflectionUtils.findMethod( // + classLoaderClass, // + "defineClass", // + String.class, // + byte[].class, // + Integer.TYPE, // + Integer.TYPE, // + ProtectionDomain.class // + ); + + defineClass.setAccessible(true); + + return defineClass; } } }