17
17
package org .springframework .instrument .classloading .jboss ;
18
18
19
19
import java .lang .instrument .ClassFileTransformer ;
20
+ import java .lang .reflect .Constructor ;
20
21
import java .lang .reflect .Field ;
21
22
import java .lang .reflect .Method ;
22
23
26
27
import org .springframework .util .Assert ;
27
28
import org .springframework .util .ClassUtils ;
28
29
import org .springframework .util .ReflectionUtils ;
30
+ import org .springframework .util .function .ThrowingFunction ;
29
31
30
32
/**
31
33
* {@link LoadTimeWeaver} implementation for JBoss's instrumentable ClassLoader.
32
34
* Thanks to Ales Justin and Marius Bogoevici for the initial prototype.
33
35
*
34
- * <p>This weaver 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.
35
38
*
36
39
* @author Costin Leau
37
40
* @author Juergen Hoeller
38
41
* @since 3.0
39
42
*/
40
43
public class JBossLoadTimeWeaver implements LoadTimeWeaver {
41
44
42
- private static final String DELEGATING_TRANSFORMER_CLASS_NAME =
45
+ private static final String LEGACY_DELEGATING_TRANSFORMER_CLASS_NAME =
43
46
"org.jboss.as.server.deployment.module.DelegatingClassFileTransformer" ;
44
47
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
+
45
54
private static final String WRAPPER_TRANSFORMER_CLASS_NAME =
46
55
"org.jboss.modules.JLIClassTransformer" ;
47
56
@@ -52,6 +61,8 @@ public class JBossLoadTimeWeaver implements LoadTimeWeaver {
52
61
53
62
private final Method addTransformer ;
54
63
64
+ private final ThrowingFunction <Object , Object > adaptTransformer ;
65
+
55
66
56
67
/**
57
68
* Create a new instance of the {@link JBossLoadTimeWeaver} class using
@@ -90,18 +101,29 @@ public JBossLoadTimeWeaver(@Nullable ClassLoader classLoader) {
90
101
wrappedTransformer .setAccessible (true );
91
102
suggestedTransformer = wrappedTransformer .get (suggestedTransformer );
92
103
}
93
- 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 {
94
116
throw new IllegalStateException (
95
- "Transformer not of the expected type DelegatingClassFileTransformer : " +
117
+ "Transformer not of expected type DelegatingClass(File)Transformer : " +
96
118
suggestedTransformer .getClass ().getName ());
97
119
}
98
120
this .delegatingTransformer = suggestedTransformer ;
99
121
100
122
Method addTransformer = ReflectionUtils .findMethod (this .delegatingTransformer .getClass (),
101
- "addTransformer" , ClassFileTransformer . class );
123
+ "addTransformer" , transformerType );
102
124
if (addTransformer == null ) {
103
125
throw new IllegalArgumentException (
104
- "Could not find 'addTransformer' method on JBoss DelegatingClassFileTransformer : " +
126
+ "Could not find 'addTransformer' method on JBoss DelegatingClass(File)Transformer : " +
105
127
this .delegatingTransformer .getClass ().getName ());
106
128
}
107
129
addTransformer .setAccessible (true );
@@ -116,7 +138,7 @@ public JBossLoadTimeWeaver(@Nullable ClassLoader classLoader) {
116
138
@ Override
117
139
public void addTransformer (ClassFileTransformer transformer ) {
118
140
try {
119
- this .addTransformer .invoke (this .delegatingTransformer , transformer );
141
+ this .addTransformer .invoke (this .delegatingTransformer , this . adaptTransformer . apply ( transformer ) );
120
142
}
121
143
catch (Throwable ex ) {
122
144
throw new IllegalStateException ("Could not add transformer on JBoss ClassLoader: " + this .classLoader , ex );
0 commit comments