From 85474297be4a71fbdab5ffa6fcaf62969b51f89b Mon Sep 17 00:00:00 2001 From: kudrevatykh Date: Tue, 5 Feb 2019 01:31:21 +0300 Subject: [PATCH] Load-time weaving support for WildFly 13+ (#22297) Load-time weaving support for WildFly 13+ (JBoss Modules 1.8+) --- .../jboss/JBossLoadTimeWeaver.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/jboss/JBossLoadTimeWeaver.java b/spring-context/src/main/java/org/springframework/instrument/classloading/jboss/JBossLoadTimeWeaver.java index bee9d2e86d..8e42e094de 100644 --- a/spring-context/src/main/java/org/springframework/instrument/classloading/jboss/JBossLoadTimeWeaver.java +++ b/spring-context/src/main/java/org/springframework/instrument/classloading/jboss/JBossLoadTimeWeaver.java @@ -41,7 +41,8 @@ public class JBossLoadTimeWeaver implements LoadTimeWeaver { private static final String DELEGATING_TRANSFORMER_CLASS_NAME = "org.jboss.as.server.deployment.module.DelegatingClassFileTransformer"; - + + private static final String WRAPPER_TRANSFORMER_CLASS_NAME = "org.jboss.modules.JLIClassTransformer"; private final ClassLoader classLoader; @@ -76,12 +77,25 @@ public class JBossLoadTimeWeaver implements LoadTimeWeaver { } transformer.setAccessible(true); - this.delegatingTransformer = transformer.get(classLoader); - if (!this.delegatingTransformer.getClass().getName().equals(DELEGATING_TRANSFORMER_CLASS_NAME)) { + Object suggestedTransformer = transformer.get(classLoader); + + if (suggestedTransformer.getClass().getName().equals(WRAPPER_TRANSFORMER_CLASS_NAME)) { + Field wrappedTransformer = ReflectionUtils.findField(suggestedTransformer.getClass(), "transformer"); + if (wrappedTransformer == null) { + throw new IllegalArgumentException("Could not find 'transformer' field on JBoss ClassTransformer: " + + suggestedTransformer.getClass().getName()); + } + wrappedTransformer.setAccessible(true); + suggestedTransformer = wrappedTransformer.get(suggestedTransformer); + } + + if (!suggestedTransformer.getClass().getName().equals(DELEGATING_TRANSFORMER_CLASS_NAME)) { throw new IllegalStateException( "Transformer not of the expected type DelegatingClassFileTransformer: " + - this.delegatingTransformer.getClass().getName()); + suggestedTransformer.getClass().getName()); } + + this.delegatingTransformer = suggestedTransformer; Method addTransformer = ReflectionUtils.findMethod(this.delegatingTransformer.getClass(), "addTransformer", ClassFileTransformer.class);