2121import java .util .Set ;
2222import java .util .WeakHashMap ;
2323import java .util .concurrent .CopyOnWriteArrayList ;
24- import java .util .function .Supplier ;
2524import net .bytebuddy .description .type .TypeDescription ;
2625import net .bytebuddy .dynamic .ClassFileLocator ;
2726import net .bytebuddy .dynamic .DynamicType ;
@@ -43,10 +42,7 @@ public class HelperInjector implements Instrumenter.TransformingAdvice {
4342 private final AdviceShader adviceShader ;
4443 private final String requestingName ;
4544
46- // Helper names are resolved lazily: when a supplier is provided, resolution is deferred to the
47- // first transform() so that we don't load the generated $Muzzle class at agent install.
48- private final Supplier <String []> helperClassNamesSupplier ;
49- private volatile Set <String > helperClassNames ;
45+ private final Set <String > helperClassNames ;
5046 private final Map <String , byte []> dynamicTypeMap = new LinkedHashMap <>();
5147
5248 private final Map <ClassLoader , Boolean > injectedClassLoaders =
@@ -81,27 +77,9 @@ public HelperInjector(
8177 this .requestingName = requestingName ;
8278 this .adviceShader = adviceShader ;
8379
84- this .helperClassNamesSupplier = null ;
8580 this .helperClassNames = new LinkedHashSet <>(asList (helperClassNames ));
8681 }
8782
88- /**
89- * Construct HelperInjector whose helper names are resolved lazily on first {@link #transform}, to
90- * avoid resolving them (which may load the generated {@code $Muzzle} class) at agent install.
91- */
92- public HelperInjector (
93- final boolean useAgentCodeSource ,
94- final AdviceShader adviceShader ,
95- final String requestingName ,
96- final Supplier <String []> helperClassNamesSupplier ) {
97- this .useAgentCodeSource = useAgentCodeSource ;
98- this .requestingName = requestingName ;
99- this .adviceShader = adviceShader ;
100-
101- this .helperClassNamesSupplier = helperClassNamesSupplier ;
102- this .helperClassNames = null ;
103- }
104-
10583 public HelperInjector (
10684 final boolean useAgentCodeSource ,
10785 final String requestingName ,
@@ -110,27 +88,11 @@ public HelperInjector(
11088 this .requestingName = requestingName ;
11189 this .adviceShader = null ;
11290
113- this .helperClassNamesSupplier = null ;
11491 helperClassNames = helperMap .keySet ();
11592 dynamicTypeMap .putAll (helperMap );
11693 }
11794
118- /** Resolves helper class names, deferring to the supplier when one's provided. */
119- private Set <String > resolveHelperClassNames () {
120- Set <String > names = helperClassNames ;
121- if (names == null ) {
122- synchronized (this ) {
123- names = helperClassNames ;
124- if (names == null ) {
125- names = new LinkedHashSet <>(asList (helperClassNamesSupplier .get ()));
126- helperClassNames = names ;
127- }
128- }
129- }
130- return names ;
131- }
132-
133- private Map <String , byte []> getHelperMap (final Set <String > helperClassNames ) throws IOException {
95+ private Map <String , byte []> getHelperMap () throws IOException {
13496 if (dynamicTypeMap .isEmpty ()) {
13597 final Map <String , byte []> classnameToBytes = new LinkedHashMap <>();
13698 for (String helperName : helperClassNames ) {
@@ -155,7 +117,6 @@ public DynamicType.Builder<?> transform(
155117 ClassLoader classLoader ,
156118 final JavaModule module ,
157119 final ProtectionDomain pd ) {
158- final Set <String > helperClassNames = resolveHelperClassNames ();
159120 if (!helperClassNames .isEmpty ()) {
160121 if (classLoader == null ) {
161122 throw new UnsupportedOperationException (
@@ -174,7 +135,7 @@ public DynamicType.Builder<?> transform(
174135 String .join ("," , helperClassNames ));
175136 }
176137
177- final Map <String , byte []> classnameToBytes = getHelperMap (helperClassNames );
138+ final Map <String , byte []> classnameToBytes = getHelperMap ();
178139 final Collection <Class <?>> classes = injectClassLoader (classLoader , classnameToBytes );
179140
180141 // all datadog helper classes are in the unnamed module
0 commit comments