Skip to content

Commit 09fe0ad

Browse files
committed
Load-time weaving support for WildFly 24+
Closes gh-33728
1 parent 84e762b commit 09fe0ad

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed

Diff for: spring-context/src/main/java/org/springframework/instrument/classloading/jboss/JBossLoadTimeWeaver.java

+30-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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.
@@ -17,6 +17,7 @@
1717
package org.springframework.instrument.classloading.jboss;
1818

1919
import java.lang.instrument.ClassFileTransformer;
20+
import java.lang.reflect.Constructor;
2021
import java.lang.reflect.Field;
2122
import java.lang.reflect.Method;
2223

@@ -26,23 +27,30 @@
2627
import org.springframework.util.Assert;
2728
import org.springframework.util.ClassUtils;
2829
import 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
*/
4143
public 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

Comments
 (0)