> Donc c'est bien le compilo qui genere un Class.forName .. et
> ajoute un changement de type d'exeception !
Je suis � l'origine de cette phrase :-)
Je n'�tait pas trop rentr� dans les d�tails car c'�tait une digression d'un
probl�me de tableau.
Je trouve que X.class est bien plus "propre" que Class.forName("X"), car
une v�rification est faite � la compilation.
Si j'�cris integer.class mon compilo va hurler, alors que
Class.forName("integer") passera.
Et si cette ligne est plac�e dans une zone de code tr�s peu employ�e, cela
peut �chapper
aux processus de test.
Maintenant, il est vrai que si la distribution est mal faite et que le
package contenant la classe
n'est pas livr� on peut avoir une error � l'ex�cution.
Ce cas par contre devrait �tre d�tect� aux tests, un package manquant �a se
voit :-)
Quand � la digression de la digression propos�e par Remi Forax, je ne saisie
pas la remarque sur l'initialisation :
> Class.forName(...) effectue l'initialisation de la classe si celle-ci
> n'a pas d�j� �t� initialis�, ce qui n'est pas le cas de
> Biniou.class.
Si les deux cas commencent par appeler Class.forName("X") alors dans les
deux cas la classe est initialis�e.
J'entend par initialisation l'initialisation des champs de classes et
l'appel des m�thodes
static {
...
}
dont je ne connais pas la d�nomination officielle :-)
Et si X.class stocke la classe trouv�e alors cette derni�re ne devrait pas
�tre d�charg�e, donc il ne devrait pas y avoir de d�faut d'initialisation
par la suite.
Quelle est donc cette subtile diff�rence d'initialisation ?
--------------------------------------------------------------------
Erik Mazoyer, Chef de projet
HyperOffice
6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex
T�l. 01 41 96 96 76
Fax 01 41 96 96 77
M�l [EMAIL PROTECTED]
-----Message d'origine-----
De : Dominique Gallot [mailto:[EMAIL PROTECTED]]
Envoy� : lundi 13 janvier 2003 10:44
� : [EMAIL PROTECTED]
Objet : Re: Typecasting et tableaux
??? C'est pas ce que j'ai dit ?
Integer.class <===> Class.forName("java.lang.Integer"). ( bon � l'exception
pres )
Donc java.lang.Integer.class cr�e une method static ( le compilo decide de
cela tout seul ) qui fait un Class.forName....
Puis change l'exception en NoClassDefFoundError qui descend de Error
plustot que de Exception( ClassNotFoundException ) !
C'est don bien le compilo qui fait tout le travaille !
4) X.class lance une Error et Class.forName("X") une exception.
2 raisons � cela,
- la premier c'est que lors de la compilation la class existait.
- La deuxieme c'est que Error ne doit pas etres catcher alors que
Exception oui --> On presume qu'elle existe parce qu'elle a ete trouver
lors que la compilation.
Donc c'est bien le compilo qui genere un Class.forName .. et ajoute un
changement de type d'exeception !
je ne me souviens plus de la discution pr�cedente mais je pense que ' "�
l'exception pres" ne change pas grand chose !
Dominique
|---------+---------------------------->
| | Guillaume Desnoix|
| | <guillaume@desnoi|
| | x.com> |
| | |
| | 10/01/2003 19:24 |
| | Please respond to|
| | java |
| | |
|---------+---------------------------->
>---------------------------------------------------------------------------
----------------------------------------------------|
|
|
| To: [EMAIL PROTECTED]
|
| cc: (bcc: Dominique Gallot/BRU/MASTERCARD)
|
| Subject: Re: Typecasting et tableaux
|
>---------------------------------------------------------------------------
----------------------------------------------------|
Dominique Gallot:
> Faux,
> 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.
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.
Donc tout le monde a tout faux ;-))
Guillaume
--
public class ForName {
private static Class class$Ljava$lang$String;
public static void main(String[] stringArr)
{
// Class class1=String.class
Class class1=(ForName.class$Ljava$lang$String != null)
? ForName.class$Ljava$lang$String
: ForName.class$("java.lang.String");
}
static Class class$(String string)
{
try { return (Class.forName(string)); }
catch (ClassNotFoundException classnotfoundexception)
{
throw new NoClassDefFoundError
(classnotfoundexception.getMessage());
}
}
}