@@ -182,7 +182,7 @@ public static class Builder extends AbstractBuilder<ContinuableClassLoader, Buil
182182 * resolver/transformer to perform the byte-code enhancement.
183183 * May not be null.
184184 */
185- Builder (ResourceTransformationFactory transformationFactory ) {
185+ public Builder (ResourceTransformationFactory transformationFactory ) {
186186 super (transformationFactory );
187187 }
188188
@@ -227,6 +227,8 @@ public ContinuableClassLoader create() {
227227
228228 /* The context to be used when loading classes and resources */
229229 protected final AccessControlContext acc ;
230+
231+ protected final ClassLoader platformClassLoader ;
230232
231233 /**
232234 * Creates a classloader to define classes dynamically.
@@ -292,6 +294,8 @@ public ContinuableClassLoader(ClassLoader parent,
292294 this .isolated = isolated ;
293295 this .systemPackages = dotEndingPackageNames (systemPackages );
294296 this .loaderPackages = dotEndingPackageNames (loaderPackages );
297+
298+ this .platformClassLoader = ClassLoader .getSystemClassLoader ().getParent ();
295299 }
296300
297301 public static Builder builder (ResourceTransformationFactory transformationFactory ) {
@@ -346,6 +350,15 @@ private boolean isParentFirst(String resourceName) {
346350 // designated to use a specific loader first
347351 // (this one or the parent one)
348352
353+ if (resourceName .startsWith ("org.apache.commons.javaflow.tools.runtime." ) ||
354+ resourceName .startsWith ("org.apache.commons.javaflow.spi." )) {
355+ return true ;
356+ }
357+
358+ // if (resourceName.startsWith("org.apache.commons.javaflow.") && !resourceName.startsWith("org.apache.commons.javaflow.examples.")) {
359+ // return true;
360+ // }
361+
349362 boolean useParentFirst = parentFirst ;
350363
351364 for (String packageName : systemPackages ) {
@@ -400,24 +413,41 @@ protected Class<?> loadClass(String className, boolean resolve) throws ClassNotF
400413 return theClass ;
401414 }
402415
416+ ClassLoader parentClassLoader = getParent ();
417+ if (null == parentClassLoader ) {
418+ parentClassLoader = platformClassLoader ;
419+ }
420+
403421 if (isParentFirst (className )) {
404422 try {
405- theClass = getParent () .loadClass (className );
423+ theClass = parentClassLoader .loadClass (className );
406424 log .debug ("Class " + className + " loaded from parent loader " + "(parentFirst)" );
407425 } catch (ClassNotFoundException cnfe ) {
408426 theClass = findClass (className );
409427 log .debug ("Class " + className + " loaded from own loader " + "(parentFirst)" );
410428 }
411429 } else {
412- try {
413- theClass = findClass (className );
414- log .debug ("Class " + className + " loaded from own loader" );
415- } catch (ClassNotFoundException cnfe ) {
416- if (isolated ) {
417- throw cnfe ;
430+ // It's an error to load anything from platform
431+ if (null != platformClassLoader ) {
432+ try {
433+ theClass = platformClassLoader .loadClass (className );
434+ log .debug ("Class " + className + " is platform class" );
435+ } catch (ClassNotFoundException ex ) {
436+ log .debug ("Class " + className + " is not visible to platform, will try to load on own loader" );
437+ }
438+ }
439+ // Not found among platform classes
440+ if (null == theClass ) {
441+ try {
442+ theClass = findClass (className );
443+ log .debug ("Class " + className + " loaded from own loader" );
444+ } catch (ClassNotFoundException cnfe ) {
445+ if (isolated ) {
446+ throw cnfe ;
447+ }
448+ theClass = parentClassLoader .loadClass (className );
449+ log .debug ("Class " + className + " loaded from parent loader" );
418450 }
419- theClass = getParent ().loadClass (className );
420- log .debug ("Class " + className + " loaded from parent loader" );
421451 }
422452 }
423453
@@ -463,7 +493,7 @@ public Class<?> run() {
463493 int i = classNameFromData .lastIndexOf ('.' );
464494 if (i > 0 ) {
465495 final String packageName = classNameFromData .substring (0 , i );
466- @ SuppressWarnings ("deprecation " )
496+ @ SuppressWarnings ("all " )
467497 final Package pkg = getPackage (packageName );
468498 if (pkg == null ) {
469499 definePackage (packageName , null , null , null , null , null , null , null );
@@ -508,17 +538,16 @@ public Class<?> run() {
508538 * from the stream.
509539 */
510540 private Class <?> getClassFromStream (InputStream stream , String className ) throws IOException , SecurityException {
511-
512- FastByteArrayOutputStream baos = new FastByteArrayOutputStream ();
541+ FastByteArrayOutputStream baos = new FastByteArrayOutputStream (BUFFER_SIZE );
513542 try {
514543
515544 int bytesRead ;
516545 byte [] buffer = new byte [BUFFER_SIZE ];
517546
518- while ((bytesRead = stream .read (buffer , 0 , BUFFER_SIZE )) != - 1 ) {
547+ while ((bytesRead = stream .read (buffer , 0 , BUFFER_SIZE )) > 0 ) {
519548 baos .write (buffer , 0 , bytesRead );
520549 }
521-
550+
522551 byte [] classData = baos .unsafeBytes ();
523552 return defineClassFromData (classData , className );
524553
0 commit comments