L'objectif est d'écrire du code java qui détecte la version JVM en s'appuyant sur les changements de compatibilité, les effets secondaires, les bugs et / ou les comportements indéfinis qui fonctionnent d'une manière dans une version et d'une autre manière dans une autre version. En outre, le code doit être au moins un peu lisible, sans sacrifier les espaces blancs et les noms de variables lisibles.
Pour garantir cet objectif, les règles formelles exactes sont les suivantes:
Le code doit être écrit en java et doit afficher la version JRE dans laquelle il s'exécute.
Le code ne doit utiliser aucune API JDK ou JRE fournie spécifiquement pour détecter la version java ou qui donne la version JDK ou JRE gratuitement.
Le code ne doit pas utiliser de réflexion.
Le code est uniquement requis pour fonctionner dans Hotspot Java SE 5, 6 et 7, mais peut fonctionner dans d'autres JVM.
Le code ne doit utiliser aucune bibliothèque tierce dans le chemin de classe.
Le code ne doit démarrer aucun autre processus, Java ou non.
Le code ne doit pas utiliser de variables d'environnement.
Le code ne doit pas rechercher dans le système de fichiers à la recherche de fichiers ou de dossiers préexistants.
Le code doit être contenu dans un seul fichier et être appelé via
public static void main(String[] args)
oupublic static void main(String... args)
.Le code ne doit utiliser aucune API non publique présente dans le JRE.
Le code ne doit générer aucune NoClassDefFoundError, NoSuchMethodError, ClassNotFoundException ou NoSuchMethodException pendant son exécution.
Le code doit s'exécuter dans un système déconnecté d'Internet ou de tout réseau local.
Vous devez expliquer pourquoi il se comporte d'une manière dans une version et d'une autre manière dans une autre version.
Notation
La méthode utilisée pour mesurer la meilleure solution est max (n / s), où n est le nombre de versions java différentes détectées sans violer aucune de ces règles (au moins les versions 5, 6 et 7) et s est le nombre de jetons lexicaux. dans la solution.