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?

--
- DML

Reply via email to