Repository: maven-surefire Updated Branches: refs/heads/SUREFIRE-1265_2 [created] bce51369e
added findClass Jigsaw Java 9 Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/bce51369 Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/bce51369 Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/bce51369 Branch: refs/heads/SUREFIRE-1265_2 Commit: bce51369e3563ed95c91346cd89c80bac7716c10 Parents: d6f3816 Author: Tibor17 <[email protected]> Authored: Sat May 6 09:10:39 2017 +0200 Committer: Tibor17 <[email protected]> Committed: Sat May 6 09:10:39 2017 +0200 ---------------------------------------------------------------------- .../surefire/booter/IsolatedClassLoader.java | 69 +++++++++++++++++++- 1 file changed, 66 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bce51369/surefire-booter/src/main/java/org/apache/maven/surefire/booter/IsolatedClassLoader.java ---------------------------------------------------------------------- diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/IsolatedClassLoader.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/IsolatedClassLoader.java index 601acd5..6a9ec22 100644 --- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/IsolatedClassLoader.java +++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/IsolatedClassLoader.java @@ -19,10 +19,12 @@ package org.apache.maven.surefire.booter; * under the License. */ +import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.atomic.AtomicStampedReference; /** * Loads classes from jar files added via {@link #addURL(URL)}. @@ -30,16 +32,20 @@ import java.util.Set; public class IsolatedClassLoader extends URLClassLoader { + private static final URL[] EMPTY_URL_ARRAY = new URL[0]; + + private static final String JAVA9_ALL_MODULES = "java.se.ee"; + private final ClassLoader parent = ClassLoader.getSystemClassLoader(); private final Set<URL> urls = new HashSet<URL>(); + private final AtomicStampedReference<Method> java9FindClass = new AtomicStampedReference<Method>( null, 0 ); + private final String roleName; private boolean childDelegation = true; - private static final URL[] EMPTY_URL_ARRAY = new URL[0]; - public IsolatedClassLoader( ClassLoader parent, boolean childDelegation, String roleName ) { super( EMPTY_URL_ARRAY, parent ); @@ -70,6 +76,21 @@ public class IsolatedClassLoader public synchronized Class loadClass( String name ) throws ClassNotFoundException { + if ( name.equals( "javax.xml.ws.Holder" ) ) + { + try + { + Method m = ClassLoader.class.getDeclaredMethod( "findClass", String.class, String.class ); + m.setAccessible( true ); + Object cls = m.invoke( this, JAVA9_ALL_MODULES, name ); + System.out.println( cls ); + } + catch ( Exception e ) + { + e.printStackTrace(); + } + } + if ( childDelegation ) { Class<?> c = findLoadedClass( name ); @@ -78,7 +99,7 @@ public class IsolatedClassLoader { try { - c = findClass( name ); + c = lookupClass( name ); } catch ( ClassNotFoundException e ) { @@ -101,6 +122,48 @@ public class IsolatedClassLoader } } + private Method lookupMethod() + { + if ( java9FindClass.getStamp() == 0 ) + { + try + { + Method findClass = ClassLoader.class.getMethod( "findClass", String.class, String.class ); + findClass.setAccessible( true ); + java9FindClass.set( findClass, 1 ); + } + catch ( NoSuchMethodException e ) + { + java9FindClass.set( null, 1 ); + } + } + return java9FindClass.getReference(); + } + + private Class<?> lookupClass( String fullyQualifiedClass ) throws ClassNotFoundException + { + Method findClass = lookupMethod(); + if ( findClass != null ) + { + Class<?> cls = null; + try + { + cls = (Class<?>) findClass.invoke( this, JAVA9_ALL_MODULES, fullyQualifiedClass ); + } + catch ( ReflectiveOperationException e ) + { + // Java 9 ClassLoader.findClass() does not throw exception. + } + + if ( cls == null ) + { + throw new ClassNotFoundException(); + } + return cls; + } + return findClass( fullyQualifiedClass ); + } + @Override public String toString() {
