Ben chez moi jdk1.3.1

public class Untitled1
{
  static {
    Class cl2 = Integer.class;
    Class cl1 = Integer[].class;
  }
}

Donne exactement la meme chose ( au type pres !  bien sur )

Voir ici la decompilation avec jad ! Attention c'est le compilateur de
JBuilder qui est utilis� !

----
    static Class _mthclass$(String x$0)
    {
        try
        {
            return Class.forName(x$0);
    //    0    0:aload_0
    //    1    1:invokestatic    #1   <Method Class Class.forName(String)>
    //    2    4:areturn
        }
        catch(ClassNotFoundException x$0)
    //*   3    5:astore_1
        {
            throw new NoClassDefFoundError(x$0.getMessage());
    //    4    6:new             #3   <Class NoClassDefFoundError>
    //    5    9:dup
    //    6   10:aload_1
    //    7   11:invokevirtual   #4   <Method String Throwable.getMessage
()>
    //    8   14:invokespecial   #5   <Method void
NoClassDefFoundError(String)>
    //    9   17:athrow
        }
    }

    static
    {
        Class cl2 = java.lang.Integer.class;
    //    0    0:getstatic       #8   <Field Class class$java$lang$Integer>
    //    1    3:ifnonnull       18

    //    2    6:ldc1            #9   <String "java.lang.Integer">
    //    3    8:invokestatic    #10  <Method Class _mthclass$(String)>
                  C'est la meme mothode qui est appel� avec
"java.lang.Integer"
    //    4   11:dup
    //    5   12:putstatic       #8   <Field Class class$java$lang$Integer>

    //    6   15:goto            21
    //    7   18:getstatic       #8   <Field Class class$java$lang$Integer>
    //    8   21:astore_0
        Class class1 = java.lang.Integer[].class;
    //    9   22:getstatic       #11  <Field Class
array$Ljava$lang$Integer>
    //   10   25:ifnonnull       40
    //   11   28:ldc1            #12  <String "[Ljava.lang.Integer;">
    //   12   30:invokestatic    #10  <Method Class _mthclass$(String)>
            Puis avec "[Ljava.lang.Integer"
    //   13   33:dup
    //   14   34:putstatic       #11  <Field Class
array$Ljava$lang$Integer>
    //   15   37:goto            43
    //   16   40:getstatic       #11  <Field Class
array$Ljava$lang$Integer>
    //   17   43:astore_1
    //*  18   44:return
    }
-----

On remarque que jad arrive a comprendre le "java.lang.Integer[].class"
c'est quand meme incroyable !
On remarque aussi que la notation java.lang.Integer.class fait du caching
via des variables static cach� !
Nom� class$java$lang$Integer et array$Ljava$lang$Integer !

Il serait interessant de voir les diff�rences de ce que produit les
diff�rents compilo !

Donc je doit ajouter Integer.class fait la meme chose que Class.forName �
l'exception pres et avec du caching !

Dominique Gallot




|---------+---------------------------->
|         |           Remi Forax       |
|         |           <[EMAIL PROTECTED]|
|         |           r>               |
|         |                            |
|         |           13/01/2003 10:36 |
|         |           Please respond to|
|         |           java             |
|         |                            |
|---------+---------------------------->
  
>-------------------------------------------------------------------------------------------------------------------------------|
  |                                                                                    
                                          |
  |       To:       [EMAIL PROTECTED]                                                  
                                          |
  |       cc:       (bcc: Dominique Gallot/BRU/MASTERCARD)                             
                                          |
  |       Subject:  Re: Typecasting et tableaux                                        
                                          |
  
>-------------------------------------------------------------------------------------------------------------------------------|




Guillaume Desnoix wrote:

> Dominique Gallot:
>
>> Faux,
>
Mai sis, mais si j'ai raison :))

>>
>> Cette notion n'est qu'un short - cut vers Class.forName()....
>> Que le compilateur fait !
>
>
> On regarde le bytecode et on constate.
>
> 1) javac et jikes generent le meme bytecode.

Faux, � partir de la version 1.17 de jikes, je crois :)

>
> 2) X.class et Class.forName("X") ne font pas la meme chose
> 3) X.class appelle Class.forName() la premiere fois et initialise
> 4) X.class lance une Error et Class.forName("X") une exception.

Aussi d'accord

>
>
> Donc tout le monde a tout faux ;-))
>
> Guillaume
>
> --

Sinon jikes emet un bytecode qui ressemble � �a :

class$(String s, boolean arraytype) {
   try {
     Class c = Class.forName(s);
     return arraytype ? c : c.getComponentType();
   } catch (ClassNotFoundException e) {
     // this uses exception chaining if you specified -target 1.4.
     throw new NoClassDefFoundError("" + e);
   }
}

Et A.class correspond � class$(A,false) tandis que
A[].class correspond � class$(A,true).

En effet, un Class.forName() sur un tableau � pour propri�t�
de ne pas initialiser la classe correspondante.

Remi








Répondre à