Cette question m'a été posée lors d'un entretien.
Comment imprimer un message sur la console sans utiliser main()
méthode ?
Cette question m'a été posée lors d'un entretien.
Comment imprimer un message sur la console sans utiliser main()
méthode ?
public class Foo {
static {
System.out.println("Message");
System.exit(0);
}
}
En System.exit(0)
quitte le programme avant que la jvm ne commence à rechercher des main()
(Remarque : cela ne fonctionne qu'avec Java 6. Même s'il se compile avec la version 7 du JDK <code>javac</code> il ne peut pas être exécuté avec son <code>java</code> parce qu'il s'attend à ce qu'un <code>main(String[])</code> méthode.)
@Roflcoptr il suffit de compiler la classe et de l'exécuter java Foo
il chargera la classe, imprimera le message et nous quitterons avant qu'il ne commence à trouver le point d'entrée pour l'exécution.
public final class Main {
static {
System.out.println("Hello World");
System.exit(0);
}
}
Le bloc statique est d'abord exécuté dès que la classe est chargée, avant que le bloc statique ne soit exécuté. main();
est invoquée et donc avant que la méthode main()
est appelé, System.exit(0)
déclenche l'arrêt de la VM.
En System.exit
interrompt l'exécution du thread en cours et de tous les autres. Quand System.exit
est appelé, la machine virtuelle effectue deux tâches de nettoyage avant de s'arrêter.
Tout d'abord, il exécute tous les crochets d'arrêt qui ont été enregistrés auprès de Runtime.addShutdownHook
. Cette fonction est utile pour libérer des ressources externes à la VM. Utilisez les crochets d'arrêt pour les actions qui doivent se produire avant la sortie de la VM.
La deuxième tâche de nettoyage effectuée par la VM lorsque System.exit
est appelé concerne les finaliseurs. Si l'un ou l'autre System.runFinalizersOnExit
ou son jumeau maléfique Runtime.runFinalizersOnExit
a été appelé, la VM exécute les finaliseurs sur tous les objets qui n'ont pas encore été finalisés. Ces méthodes ont été dépréciées il y a longtemps longtemps et à juste titre. N'appelez jamais System.runFinalizersOnExit
ou Runtime.runFinalizersOnExit
pour quelque raison que ce soit : Ils font partie des méthodes les plus les plus dangereuses des bibliothèques Java. L'appel à ces méthodes peut entraîner l'exécution de finaliseurs sur des objets vivants alors que d'autres threads les manipulent simultanément, ce qui entraîne un comportement erratique ou une perte d'efficacité. les manipulent simultanément, ce qui peut entraîner un comportement erratique ou un blocage.
En résumé, System.exit
arrête immédiatement tous les threads du programme. n'entraîne pas l'exécution de blocs finaux, mais exécute des crochets d'arrêt avant d'arrêter la VM. la VM. Utilisez les crochets d'arrêt pour mettre fin aux ressources externes lorsque la VM s'arrête. s'arrête. Il est possible d'arrêter la VM sans exécuter les crochets d'arrêt en appelant System.halt
mais cette méthode est rarement utilisée.
Il permet également d'imprimer un grand nombre d'autres choses. Au fait, qu'est-ce que "Con" ? Il ne permet pas de nommer le fichier "Con.java". +1.
-1 Fournir une solution spécifique à une plate-forme à un problème dans un langage indépendant de la plate-forme est incorrect.
Vous pouvez définir un chargeur de classe personnalisé qui imprime votre message :
public class MyClassLoader extends ClassLoader {
public MyClassLoader(ClassLoader other) {
super(other);
System.out.println("Hi there");
System.exit(0);
}
}
Exécutez ensuite la commande java c
java -Djava.system.class.loader=MyClassLoader
(il n'est pas nécessaire d'ajouter une classe en tant que paramètre)
class MainMethodNot
{
static
{
System.out.println("Hello World");
System.exit(0);
}
}
Comme le bloc d'initialisation statique est exécuté lorsque la classe est chargée pour la première fois, nous pouvons imprimer "Hello World" sans écrire de méthode principale. L'exécution est arrêtée à l'aide de la commande "System.exit()". Nous évitons ainsi l'erreur "méthode principale introuvable". C'est une question assez délicate
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.
3 votes
Comment démarrer une application sans méthode principale ?
17 votes
Je ne pense pas que ce soit une bonne question d'entretien. Vous voulez certainement tester la capacité du candidat à résoudre des problèmes, et non sa connaissance d'aspects peu utilisés de Java ?
16 votes
@CallumRogers +1 trivia sont les pires questions, ceux qui posent ces questions ne méritent pas d'être mon patron.
0 votes
Dans Bash, tapez simplement 'echo <message>'. Vous devriez recevoir des points supplémentaires pour avoir fait la chose la plus simple possible.
1 votes
Impossible dans/après Java7 car la méthode main() est recherchée avant le chargement des classes.
0 votes
C'était possible jusqu'au JDK 1.6. Depuis le JDK 1.7, il n'est plus possible d'exécuter une classe sans la méthode main.