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()
     {

Reply via email to