11/*
2- * Copyright 2002-2019 the original author or authors.
2+ * Copyright 2002-2024 the original author or authors.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
1717package org .springframework .instrument .classloading .jboss ;
1818
1919import java .lang .instrument .ClassFileTransformer ;
20+ import java .lang .reflect .Constructor ;
2021import java .lang .reflect .Field ;
2122import java .lang .reflect .Method ;
2223
2627import org .springframework .util .Assert ;
2728import org .springframework .util .ClassUtils ;
2829import org .springframework .util .ReflectionUtils ;
30+ import org .springframework .util .function .ThrowingFunction ;
2931
3032/**
3133 * {@link LoadTimeWeaver} implementation for JBoss's instrumentable ClassLoader.
3234 * Thanks to Ales Justin and Marius Bogoevici for the initial prototype.
3335 *
34- * <p>As of Spring Framework 5.0, this weaver supports WildFly 8+.
35- * As of Spring Framework 5 .1.5, it also supports WildFly 13+ .
36+ * <p>This weaver supports WildFly 13-23 (DelegatingClassFileTransformer) as well as
37+ * WildFly 24+ (DelegatingClassTransformer), as of Spring Framework 6 .1.15 .
3638 *
3739 * @author Costin Leau
3840 * @author Juergen Hoeller
3941 * @since 3.0
4042 */
4143public class JBossLoadTimeWeaver implements LoadTimeWeaver {
4244
43- private static final String DELEGATING_TRANSFORMER_CLASS_NAME =
45+ private static final String LEGACY_DELEGATING_TRANSFORMER_CLASS_NAME =
4446 "org.jboss.as.server.deployment.module.DelegatingClassFileTransformer" ;
4547
48+ private static final String DELEGATING_TRANSFORMER_CLASS_NAME =
49+ "org.jboss.as.server.deployment.module.DelegatingClassTransformer" ;
50+
51+ private static final String CLASS_TRANSFORMER_CLASS_NAME =
52+ "org.jboss.modules.ClassTransformer" ;
53+
4654 private static final String WRAPPER_TRANSFORMER_CLASS_NAME =
4755 "org.jboss.modules.JLIClassTransformer" ;
4856
@@ -53,6 +61,8 @@ public class JBossLoadTimeWeaver implements LoadTimeWeaver {
5361
5462 private final Method addTransformer ;
5563
64+ private final ThrowingFunction <Object , Object > adaptTransformer ;
65+
5666
5767 /**
5868 * Create a new instance of the {@link JBossLoadTimeWeaver} class using
@@ -91,18 +101,29 @@ public JBossLoadTimeWeaver(@Nullable ClassLoader classLoader) {
91101 wrappedTransformer .setAccessible (true );
92102 suggestedTransformer = wrappedTransformer .get (suggestedTransformer );
93103 }
94- if (!suggestedTransformer .getClass ().getName ().equals (DELEGATING_TRANSFORMER_CLASS_NAME )) {
104+
105+ Class <?> transformerType = ClassFileTransformer .class ;
106+ if (suggestedTransformer .getClass ().getName ().equals (LEGACY_DELEGATING_TRANSFORMER_CLASS_NAME )) {
107+ this .adaptTransformer = (t -> t );
108+ }
109+ else if (suggestedTransformer .getClass ().getName ().equals (DELEGATING_TRANSFORMER_CLASS_NAME )) {
110+ transformerType = classLoader .loadClass (CLASS_TRANSFORMER_CLASS_NAME );
111+ Constructor <?> adaptedTransformer = classLoader .loadClass (WRAPPER_TRANSFORMER_CLASS_NAME )
112+ .getConstructor (ClassFileTransformer .class );
113+ this .adaptTransformer = adaptedTransformer ::newInstance ;
114+ }
115+ else {
95116 throw new IllegalStateException (
96- "Transformer not of the expected type DelegatingClassFileTransformer : " +
117+ "Transformer not of expected type DelegatingClass(File)Transformer : " +
97118 suggestedTransformer .getClass ().getName ());
98119 }
99120 this .delegatingTransformer = suggestedTransformer ;
100121
101122 Method addTransformer = ReflectionUtils .findMethod (this .delegatingTransformer .getClass (),
102- "addTransformer" , ClassFileTransformer . class );
123+ "addTransformer" , transformerType );
103124 if (addTransformer == null ) {
104125 throw new IllegalArgumentException (
105- "Could not find 'addTransformer' method on JBoss DelegatingClassFileTransformer : " +
126+ "Could not find 'addTransformer' method on JBoss DelegatingClass(File)Transformer : " +
106127 this .delegatingTransformer .getClass ().getName ());
107128 }
108129 addTransformer .setAccessible (true );
@@ -117,7 +138,7 @@ public JBossLoadTimeWeaver(@Nullable ClassLoader classLoader) {
117138 @ Override
118139 public void addTransformer (ClassFileTransformer transformer ) {
119140 try {
120- this .addTransformer .invoke (this .delegatingTransformer , transformer );
141+ this .addTransformer .invoke (this .delegatingTransformer , this . adaptTransformer . apply ( transformer ) );
121142 }
122143 catch (Throwable ex ) {
123144 throw new IllegalStateException ("Could not add transformer on JBoss ClassLoader: " + this .classLoader , ex );
0 commit comments