Voici le code que j'ai :
public class StupidClass {
static {
System.out.println("Stupid class loaded!");
}
}
Et les tests que j'ai, que j'exécute séparément .
import org.junit.Test;
public class StupidTest {
@Test
public void foo() throws ClassNotFoundException {
final Class<?> stupidClass = Class.forName("StupidClass");
System.out.println(stupidClass.getSimpleName());
}
@Test
public void bar() throws ClassNotFoundException {
final Class<StupidClass> stupidClassClass = StupidClass.class;
System.out.println(stupidClassClass.getSimpleName());
}
}
Lorsque je lance le test foo Je vais voir :
Stupid class loaded!
StupidClass
Mais quand je lance le test bar tout ce que je vois c'est :
StupidClass
Citation de este page..
Les objets de classe sont construits automatiquement par la machine virtuelle Java machine virtuelle Java lors du chargement des classes et par des appels à la méthode defineClass dans le chargeur de classes.
Si je comprends bien, dans la barre de test, la classe Stupid est chargée, sinon j'aurais vu un null je suppose ? Donc l'objet Class est créé parce que la classe elle-même est chargée
Et maintenant, je cite este page
Les blocs d'initialisation statiques sont exécutés lorsque la JVM (le chargeur de classe - pour chargeur de classes) charge la StaticClass (ce qui se produit la première fois qu'elle est référencée dans le code).
Je m'attends donc à voir le texte "Stupid class loaded !" dans la barre de test également, mais ce n'est pas le cas.
Citant également Penser en Java
Chacune des classes Candy, Gum, et Cookie possède une clause statique qui est exécutée lorsque la classe est chargée pour la première fois.
ce qui n'est pas très précis, semble-t-il
Qu'est-ce que je rate ?