66package io .opentelemetry .javaagent .instrumentation .internal .classloader ;
77
88import static io .opentelemetry .javaagent .extension .matcher .AgentElementMatchers .extendsClass ;
9- import static java .util .logging .Level .WARNING ;
109import static net .bytebuddy .matcher .ElementMatchers .isMethod ;
1110import static net .bytebuddy .matcher .ElementMatchers .isProtected ;
1211import static net .bytebuddy .matcher .ElementMatchers .isPublic ;
1716import static net .bytebuddy .matcher .ElementMatchers .takesArgument ;
1817import static net .bytebuddy .matcher .ElementMatchers .takesArguments ;
1918
20- import io .opentelemetry .javaagent .bootstrap .BootstrapPackagePrefixesHolder ;
2119import io .opentelemetry .javaagent .bootstrap .CallDepth ;
2220import io .opentelemetry .javaagent .extension .instrumentation .TypeInstrumentation ;
2321import io .opentelemetry .javaagent .extension .instrumentation .TypeTransformer ;
24- import io .opentelemetry .javaagent .tooling .Constants ;
25- import java .lang .invoke .MethodHandle ;
26- import java .lang .invoke .MethodHandles ;
27- import java .lang .invoke .MethodType ;
28- import java .util .List ;
29- import java .util .logging .Logger ;
22+ import io .opentelemetry .javaagent .tooling .Utils ;
23+ import io .opentelemetry .javaagent .tooling .bytebuddy .ExceptionHandlers ;
24+ import net .bytebuddy .agent .builder .AgentBuilder ;
3025import net .bytebuddy .asm .Advice ;
26+ import net .bytebuddy .description .method .MethodDescription ;
3127import net .bytebuddy .description .type .TypeDescription ;
3228import net .bytebuddy .matcher .ElementMatcher ;
3329
@@ -53,48 +49,24 @@ public ElementMatcher<TypeDescription> typeMatcher() {
5349
5450 @ Override
5551 public void transform (TypeTransformer transformer ) {
56- transformer .applyAdviceToMethod (
57- isMethod ()
58- .and (named ("loadClass" ))
59- .and (
60- takesArguments (1 )
61- .and (takesArgument (0 , String .class ))
62- .or (
63- takesArguments (2 )
64- .and (takesArgument (0 , String .class ))
65- .and (takesArgument (1 , boolean .class ))))
66- .and (isPublic ().or (isProtected ()))
67- .and (not (isStatic ())),
68- BootDelegationInstrumentation .class .getName () + "$LoadClassAdvice" );
69- }
70-
71- public static class Holder {
72-
73- public static final List <String > bootstrapPackagesPrefixes = findBootstrapPackagePrefixes ();
74-
75- /**
76- * We have to make sure that {@link BootstrapPackagePrefixesHolder} is loaded from bootstrap
77- * class loader. After that we can use in {@link LoadClassAdvice}.
78- */
79- private static List <String > findBootstrapPackagePrefixes () {
80- try {
81- Class <?> holderClass =
82- Class .forName (
83- "io.opentelemetry.javaagent.bootstrap.BootstrapPackagePrefixesHolder" , true , null );
84- MethodHandle methodHandle =
85- MethodHandles .publicLookup ()
86- .findStatic (
87- holderClass , "getBoostrapPackagePrefixes" , MethodType .methodType (List .class ));
88- //noinspection unchecked
89- return (List <String >) methodHandle .invokeExact ();
90- } catch (Throwable e ) {
91- Logger .getLogger (Holder .class .getName ())
92- .log (WARNING , "Unable to load bootstrap package prefixes from the bootstrap CL" , e );
93- return Constants .BOOTSTRAP_PACKAGE_PREFIXES ;
94- }
95- }
52+ ElementMatcher .Junction <MethodDescription > methodMatcher = isMethod ()
53+ .and (named ("loadClass" ))
54+ .and (
55+ takesArguments (1 )
56+ .and (takesArgument (0 , String .class ))
57+ .or (
58+ takesArguments (2 )
59+ .and (takesArgument (0 , String .class ))
60+ .and (takesArgument (1 , boolean .class ))))
61+ .and (isPublic ().or (isProtected ()))
62+ .and (not (isStatic ()));
9663
97- private Holder () {}
64+ transformer .applyTransformer (
65+ new AgentBuilder .Transformer .ForAdvice ()
66+ .include (Utils .getBootstrapProxy (), Utils .getAgentClassLoader ())
67+ .withExceptionHandler (ExceptionHandlers .defaultExceptionHandler ())
68+ .advice (methodMatcher , BootDelegationInstrumentation .class .getName () + "$LoadClassAdvice" )
69+ );
9870 }
9971
10072 @ SuppressWarnings ("unused" )
@@ -113,7 +85,7 @@ public static Class<?> onEnter(@Advice.Argument(0) String name) {
11385 }
11486
11587 try {
116- for (String prefix : Holder .bootstrapPackagesPrefixes ) {
88+ for (String prefix : BootstrapPackagesHelper .bootstrapPackagesPrefixes ) {
11789 if (name .startsWith (prefix )) {
11890 try {
11991 return Class .forName (name , false , null );
@@ -134,13 +106,11 @@ public static Class<?> onEnter(@Advice.Argument(0) String name) {
134106 }
135107
136108 @ Advice .OnMethodExit (onThrowable = Throwable .class , suppress = Throwable .class )
137- @ Advice .AssignReturned .ToReturned
138- public static Class <?> onExit (
139- @ Advice .Return Class <?> result , @ Advice .Enter Class <?> resultFromBootstrapLoader ) {
109+ public static void onExit (
110+ @ Advice .Return (readOnly = false ) Class <?> result , @ Advice .Enter Class <?> resultFromBootstrapLoader ) {
140111 if (resultFromBootstrapLoader != null ) {
141- return resultFromBootstrapLoader ;
112+ result = resultFromBootstrapLoader ;
142113 }
143- return result ;
144114 }
145115 }
146116}
0 commit comments