----- Mail original ----- > De: "David M. Lloyd" <david.ll...@redhat.com> > À: jigsaw-dev@openjdk.java.net > Envoyé: Mercredi 2 Décembre 2015 15:52:56 > Objet: Re: is ClassLoader.loadClass() supposed to work on module-info classes? > > On 12/02/2015 08:46 AM, Remi Forax wrote: > > ----- 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. > > If it's not a class, it's pretty bizarre to call it "module-info.class". > At this point can we admit we're bending over backwards for principles > that don't really add up?
We already had this discussion, no ? It's a ".class" but not a java.lang.reflect.Class, i.e it's a compiled artifact of the Java platform, and the real question is why the file format of Java the platform is .class and not .btcd (for bytecode). > > -- > - DML > Rémi