75 votes

Quand le bloc statique d'une classe est-il exécuté ?

J'ai 2 bocaux, appelons-les a.jar et b.jar.

b.jar dépend de a.jar.

dans a.jar, j'ai défini une classe, appelons-la StaticClass, dans la StaticClass, j'ai défini un bloc statique, appelant une méthode nommée "init" :

public class StaticClass {
  static {
    init();
  } 

  public void static init () {
    // do some initialization here
  }
}

dans b.jar, j'ai un main, donc dans le main, je m'attends à ce que la méthode init() ait été appelée, mais en fait non. Je pense que c'est parce que la StaticClass n'a pas été chargée par le JVM.

  1. Ma conclusion est-elle correcte ?
  2. Qu'est-ce qui déclenche le chargement d'une classe par JVM ?
  3. comment puis-je faire en sorte que le bloc statique soit exécuté automatiquement ?

Merci

95voto

ŁukaszBachman Points 10541

Oui, vous avez raison. Le bloc d'initialisation statique est exécuté lorsque la JVM (le chargeur de classes, pour être précis) charge le programme. StaticClass (lorsqu'il est référencé pour la première fois dans le code).

Vous pouvez toujours forcer l'appel de cette méthode par un explicite StaticClass.init() et je suppose que c'est la façon préférée de faire les choses, plutôt que de compter sur la JVM pour initier quelque chose pour vous.

Vous pouvez également essayer d'utiliser Class.forName(String) pour forcer la première utilisation de cette classe.

7voto

stryba Points 1423

Oui vous avez raison, puisque vous n'utilisez pas votre StaticClass il n'est pas chargé par la vm et donc init() n'est jamais exécuté.

Pour votre deuxième question, vous devez probablement procéder de la manière la plus difficile possible, en analysant toutes les classes disponibles et en les chargeant.

http://stackoverflow.com/a/3223019/393657

4voto

Hiery Nomus Points 4157

Vous avez raison, le moyen le plus simple est d'accéder à la classe, par exemple faire un

StaticClass.class.newInstance();

Ou quelque chose à cet égard dans votre méthode principale. Cela permettra de s'assurer que la classe est chargée par le classloader.

3voto

C.Champagne Points 1156

Le code statique est exécuté lorsque votre classe ( StaticClass Je suppose) est référencée.

Ainsi, elle doit être exécutée si vous créez un fichier nouvelle instance de StaticClass ou si vous appeler une de ses méthodes statiques .

0voto

Thomas Points 35713

Oui, l'initialisateur statique sera exécuté lorsque la classe sera chargée. Cela se produit normalement lorsque vous accédez à la classe dans le contexte de chargement de la classe pour la première fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X