Skip to content

Commit 50db603

Browse files
rmannibucaurfscholte
authored andcommitted
Support new findClass(String,String) for JPMS support (#4)
1 parent 33df1e1 commit 50db603

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/main/java/org/codehaus/plexus/classworlds/realm/ClassRealm.java

+24
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,30 @@ private Class<?> unsynchronizedLoadClass( String name, boolean resolve )
272272
}
273273
}
274274

275+
// java11
276+
protected Class<?> findClass( String moduleName, String name )
277+
{
278+
if ( moduleName != null )
279+
{
280+
return null;
281+
}
282+
try
283+
{
284+
return super.findClass( name );
285+
}
286+
catch ( ClassNotFoundException e )
287+
{
288+
try
289+
{
290+
return strategy.getRealm().findClass( name );
291+
}
292+
catch ( ClassNotFoundException nestedException )
293+
{
294+
return null;
295+
}
296+
}
297+
}
298+
275299
protected Class<?> findClass( String name )
276300
throws ClassNotFoundException
277301
{

src/test/java/org/codehaus/plexus/classworlds/realm/ClassRealmImplTest.java

+29
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,14 @@ public void testLoadClass_ClassWorldsClassRepeatedly()
444444
}
445445
}
446446

447+
@Test
448+
public void testLoadClass_Java11()
449+
{
450+
final ExtendedClassRealm mainRealm = new ExtendedClassRealm(world);
451+
mainRealm.addURL( getJarUrl( "a.jar" ) );
452+
assertNotNull(mainRealm.simulateLoadClassFromModule( "a.A" ));
453+
}
454+
447455
@Test
448456
public void testGetResources_BaseBeforeSelf()
449457
throws Exception
@@ -497,4 +505,25 @@ public void testGetResources_SelfBeforeParent()
497505
assertEquals( Arrays.asList( new URL[] { childUrl, parentUrl } ), urls );
498506
}
499507

508+
// simulate new loadClass(Module,String) from java11
509+
// it is reversed in terms of inheritance but enables to simulate the same behavior in these tests
510+
private class ExtendedClassRealm extends ClassRealm
511+
{
512+
public ExtendedClassRealm(final ClassWorld world)
513+
{
514+
super( world, "java11", Thread.currentThread().getContextClassLoader() );
515+
}
516+
517+
public Class<?> simulateLoadClassFromModule(final String name)
518+
{
519+
synchronized (getClassLoadingLock(name))
520+
{
521+
Class<?> c = findLoadedClass(name);
522+
if (c == null) {
523+
c = findClass(null, name);
524+
}
525+
return c;
526+
}
527+
}
528+
}
500529
}

0 commit comments

Comments
 (0)