Gestion des classes statiques par la JVM

Gestion des classes statiques par la JVM - Java - Programmation

Marsh Posté le 04-12-2006 à 16:00:41    

Salut
 
Voila j'ai une question toute bête mais j'ai du mal a trouver la réponse.  
Lorsqu'une classe possède une variable ou une méthode statique, un objet de cette classe est automatiquement créé sur le tas par la JVM. Jusque la, OK.
 
Mais je me demande à quel moment cette création d'objet est faite : lorque la classe est chargée ? ou uniquement lorsque l'on accède a un membre statique ? ou bien a un autre moment ?
 
Merci j'espere que quelqu'un a une idée la dessus!

Reply

Marsh Posté le 04-12-2006 à 16:00:41   

Reply

Marsh Posté le 05-12-2006 à 02:42:37    

koslan a écrit :

Lorsqu'une classe possède une variable ou une méthode statique, un objet de cette classe est automatiquement créé

Tu veux sans doute parler d'instance, et non. (enfin, les instances des membres statiques de la classes...sont instanciés, forcément)
 

koslan a écrit :


Mais je me demande à quel moment cette création d'objet est faite : lorque la classe est chargée ? ou uniquement lorsque l'on accède a un membre statique ? ou bien a un autre moment ?


j'ai envie de dire que ça dépend du classloader, mais je *crois* que la classe ne sera chargée qu'au premier appel, et c'est à ce moment que les variables statiques sont initialisées, dans l'ordre de déclaration.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 05-12-2006 à 07:50:00    

A noter un difference de comportement en Java 5:

Citation :


Virtual Machine - Previously, evaluating a class literal (for example, Foo.class) caused the class to be initialized; as of 5.0, it does not. Code that depends on the previous behavior should be rewritten.  
 
You can use the following code to force initialization of a class:  

Code :
  1. //... Foo.class ...          //OLD CODE
  2. ... forceInit(Foo.class) ... //NEW CODE
  3.    
  4. /**
  5. * Forces the initialization of the class pertaining to  
  6. * the specified <tt>Class</tt> object.  
  7. * This method does nothing if the class is already
  8. * initialized prior to invocation.
  9. *
  10. * @param klass the class for which to force initialization
  11. * @return <tt>klass</tt>
  12. */
  13. public static <T> Class<T> forceInit(Class<T> klass) {
  14.     try {
  15.         Class.forName(klass.getName(), true, klass.getClassLoader());
  16.     } catch (ClassNotFoundException e) {
  17.         throw new AssertionError(e);  // Can't happen
  18.     }
  19.     return klass;
  20. }


The new behavior is a consequence of the fact that the VM now supports class literals in the constant pool. The old behavior remains in classes compiled with a pre-5.0 compiler or with the -target 1.4 flag, even if run in the 5.0 VM.  
 
For more information, see Initialization of Classes and Interfaces (section 12.4) in The Java Language Specification. Note that the language specification hasn't changed; it never listed class literal evaluation as an initialization trigger.  
 


http://java.sun.com/javase/technol [...] bility.jsp

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed