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