@@ -169,11 +169,11 @@ public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundExce
169
169
}
170
170
171
171
private Class <?> findAgentClass (String name ) throws ClassNotFoundException {
172
- JarEntry jarEntry = findJarEntry (name .replace ('.' , '/' ) + ".class" );
173
- if (jarEntry != null ) {
172
+ AgentJarResource jarResource = findAgentJarResource (name .replace ('.' , '/' ) + ".class" );
173
+ if (jarResource != null ) {
174
174
byte [] bytes ;
175
175
try {
176
- bytes = getJarEntryBytes (jarEntry );
176
+ bytes = getJarEntryBytes (jarResource . getJarEntry () );
177
177
} catch (IOException exception ) {
178
178
throw new ClassNotFoundException (name , exception );
179
179
}
@@ -236,18 +236,20 @@ private static String getPackageName(String className) {
236
236
return index == -1 ? null : className .substring (0 , index );
237
237
}
238
238
239
- private JarEntry findJarEntry (String name ) {
239
+ private AgentJarResource findAgentJarResource (String name ) {
240
240
// shading renames .class to .classdata
241
241
boolean isClass = name .endsWith (".class" );
242
242
if (isClass ) {
243
243
name += getClassSuffix ();
244
244
}
245
245
246
- JarEntry jarEntry = jarFile .getJarEntry (jarEntryPrefix + name );
246
+ String jarEntryName = jarEntryPrefix + name ;
247
+ JarEntry jarEntry = jarFile .getJarEntry (jarEntryName );
248
+ AgentJarResource jarResource = AgentJarResource .create (jarEntryName , jarEntry );
247
249
if (MULTI_RELEASE_JAR_ENABLE ) {
248
- jarEntry = findVersionedJarEntry ( jarEntry , name );
250
+ jarResource = findVersionedAgentJarResource ( jarResource , name );
249
251
}
250
- return jarEntry ;
252
+ return jarResource ;
251
253
}
252
254
253
255
// suffix appended to class resource names
@@ -256,22 +258,23 @@ protected String getClassSuffix() {
256
258
return "data" ;
257
259
}
258
260
259
- private JarEntry findVersionedJarEntry (JarEntry jarEntry , String name ) {
261
+ private AgentJarResource findVersionedAgentJarResource (
262
+ AgentJarResource jarResource , String name ) {
260
263
// same logic as in JarFile.getVersionedEntry
261
264
if (!name .startsWith (META_INF )) {
262
265
// search for versioned entry by looping over possible versions form high to low
263
266
int version = JAVA_VERSION ;
264
267
while (version >= MIN_MULTI_RELEASE_JAR_JAVA_VERSION ) {
265
- JarEntry versionedJarEntry =
266
- jarFile .getJarEntry (jarEntryPrefix + META_INF_VERSIONS + version + "/" + name );
268
+ String versionedJarEntryName = jarEntryPrefix + META_INF_VERSIONS + version + "/" + name ;
269
+ JarEntry versionedJarEntry = jarFile .getJarEntry (versionedJarEntryName );
267
270
if (versionedJarEntry != null ) {
268
- return versionedJarEntry ;
271
+ return AgentJarResource . create ( versionedJarEntryName , versionedJarEntry ) ;
269
272
}
270
273
version --;
271
274
}
272
275
}
273
276
274
- return jarEntry ;
277
+ return jarResource ;
275
278
}
276
279
277
280
@ Override
@@ -296,17 +299,17 @@ public URL findResource(String name) {
296
299
}
297
300
298
301
private URL findJarResource (String name ) {
299
- JarEntry jarEntry = findJarEntry (name );
300
- return getJarEntryUrl ( jarEntry );
302
+ AgentJarResource jarResource = findAgentJarResource (name );
303
+ return getAgentJarResourceUrl ( jarResource );
301
304
}
302
305
303
- private URL getJarEntryUrl ( JarEntry jarEntry ) {
304
- if (jarEntry != null ) {
306
+ private URL getAgentJarResourceUrl ( AgentJarResource jarResource ) {
307
+ if (jarResource != null ) {
305
308
try {
306
- return new URL (jarBase , jarEntry .getName ());
309
+ return new URL (jarBase , jarResource .getName ());
307
310
} catch (MalformedURLException e ) {
308
311
throw new IllegalStateException (
309
- "Failed to construct url for jar entry " + jarEntry .getName (), e );
312
+ "Failed to construct url for jar entry " + jarResource .getName (), e );
310
313
}
311
314
}
312
315
@@ -374,7 +377,8 @@ public URL getResource(String resourceName) {
374
377
// find from agent jar
375
378
if (agentClassLoader != null ) {
376
379
JarEntry jarEntry = agentClassLoader .jarFile .getJarEntry (resourceName );
377
- return agentClassLoader .getJarEntryUrl (jarEntry );
380
+ AgentJarResource jarResource = AgentJarResource .create (resourceName , jarEntry );
381
+ return agentClassLoader .getAgentJarResourceUrl (jarResource );
378
382
}
379
383
return null ;
380
384
}
@@ -385,6 +389,28 @@ protected Class<?> findClass(String name) throws ClassNotFoundException {
385
389
}
386
390
}
387
391
392
+ private static class AgentJarResource {
393
+ private final String name ;
394
+ private final JarEntry jarEntry ;
395
+
396
+ private AgentJarResource (String name , JarEntry jarEntry ) {
397
+ this .name = name ;
398
+ this .jarEntry = jarEntry ;
399
+ }
400
+
401
+ String getName () {
402
+ return name ;
403
+ }
404
+
405
+ JarEntry getJarEntry () {
406
+ return jarEntry ;
407
+ }
408
+
409
+ static AgentJarResource create (String name , JarEntry jarEntry ) {
410
+ return jarEntry != null ? new AgentJarResource (name , jarEntry ) : null ;
411
+ }
412
+ }
413
+
388
414
private static class AgentClassLoaderUrlStreamHandler extends URLStreamHandler {
389
415
private final JarFile jarFile ;
390
416
0 commit comments