La proposition d’ajout de classes masquées dans Java soumise à l'équipe de développement d'OpenJDK permettrait d’améliorer l'efficacité des implémentations de langage construites sur la JVM. Comme l’explique la JDK Enhancement Proposal, les classes masquées ne peuvent pas être utilisées directement par le bytecode d'autres classes. Elles sont plutôt destinées à être utilisées par des frameworks qui génèrent des classes à l'exécution et les utilisent indirectement via réflexion. On peut définir une classe masquée comme un membre d'un nid partageant un contrôle d'accès et pouvant être faiblement référencée par son chargeur de classe. L’équipe de l’OpenJDK n’a pas encore dit à quel moment elle comptait introduire des classes masquées dans Java.
Pour appuyer cette demande, la JDK Enhancement Proposal indique que de nombreuses implémentations de langage construites sur la JVM tirent parti de la génération dynamique de classes et améliorent ainsi leur efficacité et leur flexibilité. Par exemple, le compilateur javac de Java ne traduit pas une expression lambda dans un fichier de classe dédié au moment de la compilation, mais émet du bytecode pour générer et instancier dynamiquement une classe. De même, les langages JVM non-Java implémentent souvent des fonctionnalités d'ordre supérieur en utilisant des proxies dynamiques pour générer des classes de manière dynamique.
Une modification des API standards
En général, les implémenteurs de ces langages veulent qu'une classe générée dynamiquement fasse partie d'une classe existante générée statiquement et qu'elle ait les propriétés souhaitables des classes générées dynamiquement, comme la non-découverte et le contrôle d'accès. Cependant, les API standards qui définissent une classe n'ont pas été conçues pour cela. Si les API standard pouvaient définir des classes masquées, non découvrables, avec un cycle de vie limité, alors les frameworks situés à l'intérieur et à l'extérieur du JDK qui génèrent des classes dynamiquement pourraient, à la place, définir des classes masquées et améliorer l'efficacité du langage JVM.
Voici les objectifs de la proposition de classes masquées :
- Permettre aux frameworks de définir des classes en tant que détails d'implémentation non-découvrables du framework, afin qu'elles ne puissent pas être liées par d'autres classes, ou découvertes par réflexion.
- Dépréciation de l'API non-standard misc.Unsafe::defineAnonymousClass, l’objectif étant de la supprimer dans une prochaine version.
- Ne rien changer du tout dans le langage Java.
- Prendre en charge l'extension du nid de contrôle d'accès avec des classes non-découvrables.
- Prendre en charge le déchargement agressif de classes non découvertes, et donner aux frameworks la flexibilité de définir les classes selon les besoins.
Commentaire