[ 
https://issues.apache.org/jira/browse/POLYGENE-249?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16009242#comment-16009242
 ] 

Niclas Hedhman commented on POLYGENE-249:
-----------------------------------------

Yes, that is confirmed with the following test...

{code:java}
public class ClassLoaderTest
{
    public static void main( String[] args )
        throws Exception
    {
        URLClassLoader cl = (URLClassLoader) 
ClassLoaderTest.class.getClassLoader();
        URL[] urls = cl.getURLs();
        ShinyClassLoader shiny = new ShinyClassLoader( urls, cl );

        Class c1 = cl.loadClass( "org.apache.polygene.ClassLoaderTest$Hello" );
        Class c2 = shiny.loadClass( "org.apache.polygene.ClassLoaderTest$Abc" );
    }

    class Hello
    {}

    class Abc extends Hello
    {}

    public static class ShinyClassLoader extends URLClassLoader{

        public ShinyClassLoader( URL[] urls, ClassLoader parent )
        {
            super( urls, parent );
        }

        @Override
        public Class<?> loadClass( String classname )
            throws ClassNotFoundException
        {
            if( !classname.startsWith( 
"org.apache.polygene.ClassLoaderTest$Abc" ))
                return super.loadClass( classname );
            byte[] buffer = new byte[10000];
            String classSlash = classname.replace( '.','/' ) + ".class";
            try
            {
                for( URL url : getURLs() )
                {
                    URL resource = getResource( classSlash );
                    InputStream inputStream = resource.openStream();
                    int length = inputStream.read( buffer );
                    defineClass( null, buffer, 0, length );
                }
            }
            catch( Exception e )
            {
                e.printStackTrace();
            }
            return null;
        }
    }
}
{code}

If "shiny.loadClass(" is changed to "cl.loadClass" there is no exception.

> private and package protected types are not accessible when the should be.
> --------------------------------------------------------------------------
>
>                 Key: POLYGENE-249
>                 URL: https://issues.apache.org/jira/browse/POLYGENE-249
>             Project: Polygene
>          Issue Type: Bug
>            Reporter: Niclas Hedhman
>
> The FragmentClassLoader creates new subclasses (_Stub) in the same package as 
> its superclass. Yet, the classloading of a 
> {code:java}
>     package org.apache.polygene.abc;
>     class Abc
>         implements SomeType
>     {}
> {code}
> will insist that the Abc.class is public or protected and that the 
> SomeType.class is public. Otherwise an IllegalAccessException is thrown.
> {code}
> java.lang.IllegalAccessError: class org.apache.polygene.abc.Abc_Stub cannot 
> access its superclass org.apache.polygene.abc.Abc
> {code}
> and
> {code}
> java.lang.IllegalAccessError: tried to access class 
> org.apache.polygene.abc.SomeType from class org.apache.polygene.abc.Abc_Stub
> {code}
> This is probably because the FragmentClassLoader is doing something wrong 
> regarding packages. Maybe it is not enough to give the right name to the 
> class, but also have to put in some type of package reference.
> The work-around is more 'public' and 'protected' fragment types, but that is 
> not ideal.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to