----- Mail original -----
> De: "Alan Bateman" <alan.bate...@oracle.com>
> À: "Stephane Epardaud" <s...@epardaud.fr>, jigsaw-dev@openjdk.java.net
> Envoyé: Mercredi 2 Décembre 2015 14:56:00
> Objet: Re: is ClassLoader.loadClass() supposed to work on module-info classes?
> 
> On 02/12/2015 11:01, Stephane Epardaud wrote:
> > Just tried it and got:
> >
> > Exception in thread "main" java.lang.ClassFormatError: Illegal class
> > name "com.ceylon.java9.Test" in class file module-info
> >      at java.lang.ClassLoader.defineClass1(java.base@9.0/Native Method)
> >      at
> >      java.lang.ClassLoader.defineClass(java.base@9.0/ClassLoader.java:854)
> >      at
> > java.security.SecureClassLoader.defineClass(java.base@9.0/SecureClassLoader.java:152)
> >      at
> > java.net.URLClassLoader.defineClass(java.base@9.0/URLClassLoader.java:462)
> >      at
> > java.net.URLClassLoader.access$100(java.base@9.0/URLClassLoader.java:75)
> >      at
> >      java.net.URLClassLoader$1.run(java.base@9.0/URLClassLoader.java:370)
> >      at
> >      java.net.URLClassLoader$1.run(java.base@9.0/URLClassLoader.java:364)
> >      at java.security.AccessController.doPrivileged(java.base@9.0/Native
> > Method)
> >      at
> > java.net.URLClassLoader.findClass(java.base@9.0/URLClassLoader.java:363)
> >      at java.lang.ClassLoader.loadClass(java.base@9.0/ClassLoader.java:440)
> >      at java.lang.ClassLoader.loadClass(java.base@9.0/ClassLoader.java:373)
> >
> > I know it works for package-info.class files, but is it supposed to work
> > with module-info.class files too? Or is it just not implemented yet?
> >
> The this_class should be <internal-name>/module-info but in any case,
> this isn't the way to "define" a module to the run-time. Instead modules
> are defined in layers, with Layer.create the method to create a Layer.

Alan,
there are two issues, the first one is should a module-info be accessible at 
runtime as a Class and the second is that the current binary format for a 
module-info.class break the invariant that the name of the .class is the same 
as the name inside of the .class because the name used for a module-info.class 
is the name of the module.
 
1) I think module-info should not be reified to a class, defineClass should 
reject any .class that has a module bit set in the class file format.
   If we allow to create a Class from a module-info, a class loader may be able 
to load several module-info.class and it will be a real mess because 
module-info.class is not qualified in the jar file so the classloader will 
return the first seen.
2) In term of backward compatibility, I think i prefer that the 
module-info.class uses "module-info" as class name and store the name of the 
module inside an attribute.
   An already existing tool that parses the bytecode format may forget to check 
the class version and use the module name to do something, if the name inside 
the module-info is "module-info", it will be easier to diagnose because the 
error will report a failure on "module-info" and not on a name that can also be 
a package name. 

> 
> -Alan.
> 

Rémi

Reply via email to