Accès aux champs de la classe sans utiliser la reflection?

Existe-t-il un moyen d’accéder à un Field spécifique d’une classe sans utiliser la reflection?

Considérez cette classe:

 class MyType { public int theNumber; } 

Où j’aimerais accéder à java.lang.reflect.Field .

Cela fonctionne à coup sûr:

 Field f = MyType.class.getDeclaredField("theNumber"); 

Cependant, je voudrais vérifier le nom du champ, alors idéalement, quelque chose comme ceci (mais mon exemple ne comstack évidemment pas):

 Field f = MyType.class::theNumber; 

Est-ce possible ou suis-je en train de maîsortingser les capacités du compilateur?

Vous pouvez étendre le compilateur Java avec des processeurs d’annotation. Ces processeurs sont un moyen de scanner votre code source lors de la compilation. Ils ont été introduits avec Annotations mais ils sont capables d’parsingr l’ensemble du code source, pas seulement les annotations.

Avec le code source numérisé, vous pouvez générer des classes d’accesseurs pour toutes les classes que vous comstackz. De cette façon, vous pouvez éliminer la reflection.

Si vous voulez seulement obtenir des erreurs pendant que vous écrivez du code dans votre IDE, vous pouvez utiliser javax.annotation.processing.ProcessingEnvironment.getMessager (). PrintMessage () (voir aussi javax.tools.DiagnosticListener) pour générer des erreurs que l’EDI peut afficher .

L’idée de base est donc:

  1. écrire un processeur d’annotation qui scanne le code source que vous voulez refléter
  2. extraire le champ auquel vous voulez avoir access via javax.lang.model.element.ElementVisitor

Si vous voulez générer un type, sauvegardez l’access au champ:

3.1. générer une source qui accédera à ce code source

Si vous souhaitez vous assurer qu’un appel réflexif à un champ est valide:

3.2. soulève une erreur via ProcessingEnvironment.getMessager (). printMessage ()

Bien sûr, vous devez écrire le code pour vérifier les appels réfléchissants ou générer les accesseurs.

Et les informations que vous souhaitez obtenir doivent pouvoir être extraites du code source car toute la magie se produit lors de la compilation et non au moment de l’exécution.

Question interessante. Non, il n’y a aucun moyen de faire cela sans utiliser java.lang.reflect , mais étant donné la pseudo-propriété de class intégrée sur les classes, je peux voir pourquoi vous demandez.

Le métamodèle JPA2 (utilisé dans les requêtes typesafe “par critères”) a un concept similaire.

 MyType_.theNumber 

Est mis en œuvre par des “pré-processeurs” supplémentaires. Vous pouvez enquêter dans ce domaine.

Non, ce n’est pas … mais vous pouvez y arriver avec une interface et une fermeture

 public interface Getter { V get(T object); } public static Getter theNumberGetter = (MyType myType) -> { myType.theNumber };