polygene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Niclas Hedhman (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (POLYGENE-249) private and package protected types are not accessible when the should be.
Date Sat, 13 May 2017 10:02:04 GMT

    [ 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)

Mime
View raw message