Skip to content

Commit 8beb134

Browse files
authored
Load agent classes child first (#5950)
1 parent 2fa85f1 commit 8beb134

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentClassLoader.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,25 @@ public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundExce
138138
throw new ClassNotFoundException(name);
139139
}
140140

141-
return super.loadClass(name, resolve);
141+
synchronized (getClassLoadingLock(name)) {
142+
Class<?> clazz = findLoadedClass(name);
143+
// first search agent classes
144+
if (clazz == null) {
145+
clazz = findAgentClass(name);
146+
}
147+
// search from parent and urls added to this loader
148+
if (clazz == null) {
149+
clazz = super.loadClass(name, false);
150+
}
151+
if (resolve) {
152+
resolveClass(clazz);
153+
}
154+
155+
return clazz;
156+
}
142157
}
143158

144-
@Override
145-
protected Class<?> findClass(String name) throws ClassNotFoundException {
159+
private Class<?> findAgentClass(String name) throws ClassNotFoundException {
146160
JarEntry jarEntry = findJarEntry(name.replace('.', '/') + ".class");
147161
if (jarEntry != null) {
148162
byte[] bytes;
@@ -156,8 +170,7 @@ protected Class<?> findClass(String name) throws ClassNotFoundException {
156170
return defineClass(name, bytes);
157171
}
158172

159-
// find class from agent initializer jar
160-
return super.findClass(name);
173+
return null;
161174
}
162175

163176
public Class<?> defineClass(String name, byte[] bytes) {
@@ -281,7 +294,7 @@ private URL getJarEntryUrl(JarEntry jarEntry) {
281294
public Enumeration<URL> findResources(String name) throws IOException {
282295
// find resources from agent initializer jar
283296
Enumeration<URL> delegate = super.findResources(name);
284-
// agent jar can have only once resource for given name
297+
// agent jar can have only one resource for given name
285298
URL url = findJarResource(name);
286299
if (url != null) {
287300
return new Enumeration<URL>() {

0 commit comments

Comments
 (0)